Files
CapCutAPI/example.py
sun-guannan 50f7b3fe09 fix bug
2025-08-06 18:13:38 +08:00

2377 lines
84 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import requests
import json
import sys
import time
from settings.local import PORT
from util import timing_decorator
import functools
import threading
from pyJianYingDraft.text_segment import TextStyleRange, Text_style, Text_border
from util import hex_to_rgb
import shutil
import os
# Base URL of the service, please modify according to actual situation
BASE_URL = f"http://localhost:{PORT}"
LICENSE_KEY = "trial" # Trial license key
CAPCUT_DRAFT_FOLDER = "/Users/sunguannan/Movies/CapCut/User Data/Projects/com.lveditor.draft"
JIANYINGPRO_DRAFT_FOLDER = "/Users/sunguannan/Movies/JianyingPro/User Data/Projects/com.lveditor.draft"
def make_request(endpoint, data, method='POST'):
"""Send HTTP request to the server and handle the response"""
url = f"{BASE_URL}/{endpoint}"
headers = {'Content-Type': 'application/json'}
try:
if method == 'POST':
response = requests.post(url, data=json.dumps(data), headers=headers)
elif method == 'GET':
response = requests.get(url, params=data, headers=headers)
else:
raise ValueError(f"Unsupported HTTP method: {method}")
response.raise_for_status() # Raise an exception if the request fails
return response.json()
except requests.exceptions.RequestException as e:
print(f"Request error: {e}")
sys.exit(1)
except json.JSONDecodeError:
print("Unable to parse server response")
sys.exit(1)
def add_audio_track(audio_url, start, end, target_start, volume=1.0,
speed=1.0, track_name="main_audio", effect_type=None, effect_params=None, draft_id=None):
"""API call to add audio track"""
data = {
"audio_url": audio_url,
"start": start,
"end": end,
"target_start": target_start,
"volume": volume,
"speed": speed,
"track_name": track_name,
"effect_type": effect_type,
"effect_params": effect_params
}
if draft_id:
data["draft_id"] = draft_id
return make_request("add_audio", data)
def add_text_impl(text, start, end, font, font_color, font_size, track_name, draft_folder="123", draft_id=None,
vertical=False, transform_x=0, transform_y=0, font_alpha=1.0,
border_color=None, border_width=0.0, border_alpha=1.0,
background_color=None, background_alpha=1.0, background_style=None,
background_round_radius=0.0, background_height=0.14, background_width=0.14,
background_horizontal_offset=0.5, background_vertical_offset=0.5,
shadow_enabled=False, shadow_alpha=0.9, shadow_angle=-45.0,
shadow_color="#000000", shadow_distance=5.0, shadow_smoothing=0.15,
bubble_effect_id=None, bubble_resource_id=None,
effect_effect_id=None,
intro_animation=None, intro_duration=0.5,
outro_animation=None, outro_duration=0.5,
width=1080, height=1920,
fixed_width=-1, fixed_height=-1,
text_styles=None):
"""Add text with support for multiple styles, shadows, and backgrounds"""
data = {
"draft_folder": draft_folder,
"text": text,
"start": start,
"end": end,
"font": font,
"font_color": font_color,
"font_size": font_size,
"alpha": font_alpha,
"track_name": track_name,
"vertical": vertical,
"transform_x": transform_x,
"transform_y": transform_y
}
# Add border parameters
if border_color:
data["border_color"] = border_color
data["border_width"] = border_width
data["border_alpha"] = border_alpha
# Add background parameters
if background_color:
data["background_color"] = background_color
data["background_alpha"] = background_alpha
if background_style:
data["background_style"] = background_style
data["background_round_radius"] = background_round_radius
data["background_height"] = background_height
data["background_width"] = background_width
data["background_horizontal_offset"] = background_horizontal_offset
data["background_vertical_offset"] = background_vertical_offset
# Add shadow parameters
if shadow_enabled:
data["shadow_enabled"] = shadow_enabled
data["shadow_alpha"] = shadow_alpha
data["shadow_angle"] = shadow_angle
data["shadow_color"] = shadow_color
data["shadow_distance"] = shadow_distance
data["shadow_smoothing"] = shadow_smoothing
# Add bubble effect parameters
if bubble_effect_id:
data["bubble_effect_id"] = bubble_effect_id
if bubble_resource_id:
data["bubble_resource_id"] = bubble_resource_id
# Add text effect parameters
if effect_effect_id:
data["effect_effect_id"] = effect_effect_id
# Add intro animation parameters
if intro_animation:
data["intro_animation"] = intro_animation
data["intro_duration"] = intro_duration
# Add outro animation parameters
if outro_animation:
data["outro_animation"] = outro_animation
data["outro_duration"] = outro_duration
# Add size parameters
data["width"] = width
data["height"] = height
# Add fixed size parameters
if fixed_width > 0:
data["fixed_width"] = fixed_width
if fixed_height > 0:
data["fixed_height"] = fixed_height
if draft_id:
data["draft_id"] = draft_id
# Add text styles parameters
if text_styles:
data["text_styles"] = text_styles
if draft_id:
data["draft_id"] = draft_id
return make_request("add_text", data)
def add_image_impl(image_url, width, height, start, end, track_name, draft_id=None,
transform_x=0, transform_y=0, scale_x=1.0, scale_y=1.0, transition=None, transition_duration=None,
mask_type=None, mask_center_x=0.0, mask_center_y=0.0, mask_size=0.5,
mask_rotation=0.0, mask_feather=0.0, mask_invert=False,
mask_rect_width=None, mask_round_corner=None, background_blur=None):
"""API call to add image"""
data = {
"image_url": image_url,
"width": width,
"height": height,
"start": start,
"end": end,
"track_name": track_name,
"transform_x": transform_x,
"transform_y": transform_y,
"scale_x": scale_x,
"scale_y": scale_y,
"transition": transition,
"transition_duration": transition_duration or 0.5, # Default transition duration is 0.5 seconds
# Add mask-related parameters
"mask_type": mask_type,
"mask_center_x": mask_center_x,
"mask_center_y": mask_center_y,
"mask_size": mask_size,
"mask_rotation": mask_rotation,
"mask_feather": mask_feather,
"mask_invert": mask_invert,
"mask_rect_width": mask_rect_width,
"mask_round_corner": mask_round_corner
}
if draft_id:
data["draft_id"] = draft_id
if background_blur:
data["background_blur"] = background_blur
return make_request("add_image", data)
def generate_image_impl(prompt, width, height, start, end, track_name, draft_id=None,
transform_x=0, transform_y=0, scale_x=1.0, scale_y=1.0, transition=None, transition_duration=None):
"""API call to add image"""
data = {
"prompt": prompt,
"width": width,
"height": height,
"start": start,
"end": end,
"track_name": track_name,
"transform_x": transform_x,
"transform_y": transform_y,
"scale_x": scale_x,
"scale_y": scale_y,
"transition": transition,
"transition_duration": transition_duration or 0.5 # Default transition duration is 0.5 seconds
}
if draft_id:
data["draft_id"] = draft_id
return make_request("generate_image", data)
def add_sticker_impl(resource_id, start, end, draft_id=None, transform_x=0, transform_y=0,
alpha=1.0, flip_horizontal=False, flip_vertical=False, rotation=0.0,
scale_x=1.0, scale_y=1.0, track_name="sticker_main", relative_index=0,
width=1080, height=1920):
"""API call to add sticker"""
data = {
"sticker_id": resource_id,
"start": start,
"end": end,
"transform_x": transform_x,
"transform_y": transform_y,
"alpha": alpha,
"flip_horizontal": flip_horizontal,
"flip_vertical": flip_vertical,
"rotation": rotation,
"scale_x": scale_x,
"scale_y": scale_y,
"track_name": track_name,
"relative_index": relative_index,
"width": width,
"height": height
}
if draft_id:
data["draft_id"] = draft_id
return make_request("add_sticker", data)
def add_video_keyframe_impl(draft_id, track_name, property_type=None, time=None, value=None,
property_types=None, times=None, values=None):
"""API call to add video keyframe
Supports two modes:
1. Single keyframe: using property_type, time, value parameters
2. Batch keyframes: using property_types, times, values parameters (in list form)
"""
data = {
"draft_id": draft_id,
"track_name": track_name
}
# Add single keyframe parameters (if provided)
if property_type is not None:
data["property_type"] = property_type
if time is not None:
data["time"] = time
if value is not None:
data["value"] = value
# Add batch keyframe parameters (if provided)
if property_types is not None:
data["property_types"] = property_types
if times is not None:
data["times"] = times
if values is not None:
data["values"] = values
return make_request("add_video_keyframe", data)
def add_video_impl(video_url, start=None, end=None, width=None, height=None, track_name="main",
draft_id=None, transform_y=0, scale_x=1, scale_y=1, transform_x=0,
speed=1.0, target_start=0, relative_index=0, transition=None, transition_duration=None,
# Mask-related parameters
mask_type=None, mask_center_x=0.5, mask_center_y=0.5, mask_size=1.0,
mask_rotation=0.0, mask_feather=0.0, mask_invert=False,
mask_rect_width=None, mask_round_corner=None, background_blur=None):
"""API call to add video track"""
data = {
"video_url": video_url,
"height": height,
"draft_id": draft_id,
"track_name": track_name,
"transform_y": transform_y,
"scale_x": scale_x,
"scale_y": scale_y,
"transform_x": transform_x,
"speed": speed,
"target_start": target_start,
"relative_index": relative_index,
"transition": transition,
"transition_duration": transition_duration or 0.5, # Default transition duration is 0.5 seconds
# Mask-related parameters
"mask_type": mask_type,
"mask_center_x": mask_center_x,
"mask_center_y": mask_center_y,
"mask_size": mask_size,
"mask_rotation": mask_rotation,
"mask_feather": mask_feather,
"mask_invert": mask_invert,
"mask_rect_width": mask_rect_width,
"mask_round_corner": mask_round_corner
}
if start:
data["start"] = start
if end:
data["end"] = end
if width:
data["width"] = width
if height:
data["height"] = height
if background_blur:
data["background_blur"] = background_blur
return make_request("add_video", data)
def add_effect(effect_type, start, end, draft_id=None, track_name="effect_01",
params=None, width=1080, height=1920, effect_category=None):
"""API call to add effect"""
data = {
"effect_type": effect_type,
"start": start,
"end": end,
"track_name": track_name,
"params": params or [],
"width": width,
"height": height
}
if effect_category:
data["effect_category"] = effect_category
if draft_id:
data["draft_id"] = draft_id
return make_request("add_effect", data)
def test_effect_01():
"""Test adding effect service"""
draft_folder = CAPCUT_DRAFT_FOLDER
print("\nTest: Adding effect")
effect_result = add_effect(
start=0,
end=5,
track_name="effect_01",
# effect_type="金粉闪闪", # Example using glow effect
effect_type="Gold_Sparkles",
params=[100, 50, 34] # Example parameters, depending on the specific effect type
)
print(f"Effect adding result: {effect_result}")
print(save_draft_impl(effect_result['output']['draft_id'], draft_folder))
# If needed, you can add other test cases here
# Return the first test result for subsequent operations (if any)
return effect_result
def test_effect_02():
"""Test service for adding effects"""
# draft_folder = "/Users/sunguannan/Movies/JianyingPro/User Data/Projects/com.lveditor.draft"
draft_folder = "/Users/sunguannan/Movies/CapCut/User Data/Projects/com.lveditor.draft"
print("\nTest: Adding effects")
# First add video track
image_result = add_video_impl(
video_url="https://pan.superbed.cn/share/1nbrg1fl/jimeng_daweidai.mp4",
start=0,
end=3.0,
target_start=0,
width=1080,
height=1920
)
print(f"Video added successfully! {image_result['output']['draft_id']}")
image_result = add_video_impl(
video_url="https://pan.superbed.cn/share/1nbrg1fl/jimeng_daweidai.mp4",
draft_id=image_result['output']['draft_id'],
start=0,
end=3.0,
target_start=3,
)
print(f"Video added successfully! {image_result['output']['draft_id']}")
# Then add effect
effect_result = add_effect(
effect_type="Like",
effect_category="character", # Explicitly specify as character effect
start=3,
end=6,
draft_id=image_result['output']['draft_id'],
track_name="effect_01"
)
print(f"Effect adding result: {effect_result}")
print(save_draft_impl(effect_result['output']['draft_id'], draft_folder))
source_folder = os.path.join(os.getcwd(), effect_result['output']['draft_id'])
destination_folder = os.path.join(draft_folder, effect_result['output']['draft_id'])
if os.path.exists(source_folder):
print(f"Moving {effect_result['output']['draft_id']} to {draft_folder}")
shutil.move(source_folder, destination_folder)
print("Folder moved successfully!")
else:
print(f"Source folder {source_folder} does not exist")
# Add log to prompt user to find the draft in CapCut
print(f"\n===== IMPORTANT =====\nPlease open CapCut and find the draft named '{effect_result['output']['draft_id']}'\n======================")
# Return the first test result for subsequent operations (if any)
return effect_result
def test_text():
"""Test adding text with various features"""
draft_folder = CAPCUT_DRAFT_FOLDER
# Test case 1: Basic text addition
print("\nTest: Adding basic text")
text_result = add_text_impl(
text="Hello, I am CapCut Assistant",
start=0,
end=3,
font="思源中宋",
font_color="#FF0000", # Red
track_name="main_text",
transform_y=0.8,
transform_x=0.5,
font_size=30.0
)
print("Test case 1 (Basic text) successful:", text_result)
# Test case 2: Vertical text
result2 = add_text_impl(
draft_id=text_result['output']['draft_id'],
text="Vertical text demo",
start=3,
end=6,
font="云书法三行魏碑体",
font_color="#00FF00", # Green
font_size=8.0,
track_name="main_text",
vertical=True, # Enable vertical text
transform_y=-0.5,
outro_animation='Blur'
)
print("Test case 2 (Vertical text) successful:", result2)
# Test case 3: Text with border and background
result3 = add_text_impl(
draft_id=result2['output']['draft_id'],
text="Border and background test",
start=6,
end=9,
font="思源中宋",
font_color="#FFFFFF", # White text
font_size=24.0,
track_name="main_text",
transform_y=0.0,
transform_x=0.5,
border_color="#FF0000", # Red border
border_width=20.0,
border_alpha=1.0,
background_color="#0000FF", # Blue background
background_alpha=0.5, # Semi-transparent background
background_style=0 # Bubble style background
)
print("Test case 3 (Border and background) successful:", result3)
# Test case 4: Text with shadow effect
result4 = add_text_impl(
draft_id=result3['output']['draft_id'],
text="Shadow effect test",
start=9,
end=12,
font="思源中宋",
font_color="#FFFFFF", # White text
font_size=28.0,
track_name="main_text",
transform_y=-0.3,
transform_x=0.5,
shadow_enabled=True, # Enable shadow
shadow_alpha=0.8,
shadow_angle=-30.0,
shadow_color="#000000", # Black shadow
shadow_distance=8.0,
shadow_smoothing=0.2
)
print("Test case 4 (Shadow effect) successful:", result4)
# Test case 5: Multi-style text using TextStyleRange
# Create different text styles
style1 = {
"start": 0,
"end": 5,
"style": {
"color": "#FF0000", # Red
"size": 30,
"bold": True
},
"border": {
"color": "#FFFFFF", # White border
"width": 40,
"alpha": 1.0
},
"font": "思源中宋"
}
style2 = {
"start": 5,
"end": 10,
"style": {
"color": "#00FF00", # Green
"size": 25,
"italic": True
},
"font": "挥墨体"
}
style3 = {
"start": 10,
"end": 15,
"style": {
"color": "#0000FF", # Blue
"size": 20,
"underline": True
},
"font": "金陵体"
}
# Add multi-style text
result5 = add_text_impl(
draft_id=result4['output']['draft_id'],
text="Multi-style text test",
start=12,
end=15,
font="思源粗宋",
track_name="main_text",
transform_y=0.3,
transform_x=0.5,
font_color="#000000", # Default black
font_size=20.0,
# Use dictionary list instead of TextStyleRange object list
text_styles=[style1, style2, style3]
)
print("Test case 5 (Multi-style text) successful:", result5)
# Test case 6: Combined effects - shadow + background + multi-style
combined_style1 = {
"start": 0,
"end": 8,
"style": {
"color": "#FFD700", # Gold
"size": 32,
"bold": True
},
"border": {
"color": "#8B4513", # Brown border
"width": 30,
"alpha": 0.8
},
"font": "思源中宋"
}
combined_style2 = {
"start": 8,
"end": 16,
"style": {
"color": "#FF69B4", # Hot pink
"size": 28,
"italic": True
},
"font": "挥墨体"
}
result6 = add_text_impl(
draft_id=result5['output']['draft_id'],
text="Combined effects demo",
start=15,
end=18,
font="思源粗宋",
track_name="main_text",
transform_y=-0.6,
transform_x=0.5,
font_color="#FFFFFF", # Default white
font_size=24.0,
# Background settings
background_color="#4169E1", # Royal blue background
background_alpha=0.6,
background_style=1,
background_round_radius=0.3,
background_height=0.18,
background_width=0.8,
# Shadow settings
shadow_enabled=True,
shadow_alpha=0.7,
shadow_angle=-60.0,
shadow_color="#2F4F4F", # Dark slate gray shadow
shadow_distance=6.0,
shadow_smoothing=0.25,
# Multi-style text
text_styles=[combined_style1, combined_style2]
)
print("Test case 6 (Combined effects) successful:", result6)
# Finally save and upload the draft
if result6.get('success') and result6.get('output'):
save_result = save_draft_impl(result6['output']['draft_id'], draft_folder)
print(f"Draft save result: {save_result}")
# Return the last test result for subsequent operations (if any)
return result6
def test_text_02():
"""测试添加文本"""
draft_folder = CAPCUT_DRAFT_FOLDER
# 测试用例1基本文本添加
print("\n测试:添加基本文本")
text_result = add_text_impl(
text="你好,我是剪映助手",
start=0,
end=3,
font="思源中宋",
font_color="#FF0000", # 红色
track_name="main_text",
transform_y=0.8,
transform_x=0.5,
font_size=30.0
)
print("测试用例1基本文本成功:", text_result)
# 测试用例2竖排文本
result2 = add_text_impl(
draft_id=text_result['output']['draft_id'],
text="竖排文本演示",
start=3,
end=6,
font="云书法三行魏碑体",
font_color="#00FF00", # 绿色
font_size=8.0,
track_name="main_text",
vertical=True, # 启用竖排
transform_y=-0.5,
outro_animation='晕开'
)
print("测试用例2竖排文本成功:", result2)
# 测试用例3带描边和背景的文本
result3 = add_text_impl(
draft_id=result2['output']['draft_id'],
text="描边和背景测试",
start=6,
end=9,
font="思源中宋",
font_color="#FFFFFF", # 白色文字
font_size=24.0,
track_name="main_text",
transform_y=0.0,
transform_x=0.5,
border_color="#FF0000", # 红色描边
border_width=20.0,
border_alpha=1.0,
background_color="#0000FF", # 蓝色背景
background_alpha=0.5, # 半透明背景
background_style=0 # 气泡样式背景
)
print("测试用例3描边和背景成功:", result3)
# 测试用例4使用 TextStyleRange 的多样式文本
# 创建不同的文本样式
style1 = {
"start": 0,
"end": 2,
"style": {
"color": "#FF0000", # 红色
"size": 30,
"bold": True
},
"border": {
"color": "#FFFFFF", # 白色描边
"width": 40,
"alpha": 1.0
},
"font": "思源中宋"
}
style2 = {
"start": 2,
"end": 4,
"style": {
"color": "#00FF00", # 绿色
"size": 25,
"italic": True
},
"font": "挥墨体"
}
style3 = {
"start": 4,
"end": 6,
"style": {
"color": "#0000FF", # 蓝色
"size": 20,
"underline": True
},
"font": "金陵体"
}
# 添加多样式文本
result4 = add_text_impl(
draft_id=result3['output']['draft_id'],
text="多样式\n文本测试",
start=9,
end=12,
font="思源粗宋",
track_name="main_text",
transform_y=0.5,
transform_x=0.5,
font_color="#000000", # 默认黑色
font_size=20.0,
# 使用字典列表而不是 TextStyleRange 对象列表
text_styles=[style1, style2, style3]
)
print("测试用例4多样式文本成功:", result4)
# 最后保存并上传草稿
if result4.get('success') and result4.get('output'):
save_result = save_draft_impl(result4['output']['draft_id'],draft_folder)
print(f"草稿保存结果: {save_result}")
# 返回最后一个测试结果用于后续操作(如果有的话)
return result4
def test_text_03():
"""测试添加文本"""
draft_folder = CAPCUT_DRAFT_FOLDER
# 测试用例1基本文本添加
print("\n测试:添加基本文本")
text_result = add_text_impl(
text="现在支持",
start=0,
end=6,
font="挥墨体",
font_color="#FFFFFF", # 红色
track_name="text_01",
transform_y=0.58,
transform_x=0,
font_size=24.0,
intro_animation="弹入",
intro_duration=0.5
)
print("测试用例1基本文本成功:", text_result)
# 测试用例2带背景参数的文本
result2 = add_text_impl(
draft_id=text_result['output']['draft_id'],
text="文字背景",
start=1.5,
end=6,
font="思源中宋",
font_color="#FFFFFF",
font_size=20.0,
track_name="text_2",
transform_y=0.15,
transform_x=0,
background_color="#0000FF", # 蓝色背景
background_alpha=0.7, # 70%透明度
background_style=1,
background_round_radius=0.5, # 圆角半径
background_height=0.2, # 背景高度
background_width=0.8, # 背景宽度
background_horizontal_offset=0.5, # 水平居中
background_vertical_offset=0.5, # 垂直居中
intro_animation="弹入",
intro_duration=0.5
)
print("测试用例2背景参数成功:", result2)
# 测试用例3带阴影参数的文本
result3 = add_text_impl(
draft_id=result2['output']['draft_id'],
text="文字阴影",
start=3,
end=6,
font="金陵体",
font_color="#FFFF00", # 黄色文字
font_size=25.0,
track_name="text3",
transform_y=-0.16,
transform_x=0,
shadow_enabled=True, # 启用阴影
shadow_alpha=0.8, # 阴影透明度
shadow_angle=-45.0, # 阴影角度
shadow_color="#0000FF", # 蓝色阴影
shadow_distance=10.0, # 阴影距离
shadow_smoothing=0.3, # 阴影平滑度
intro_animation="弹入",
intro_duration=0.5
)
print("测试用例3阴影参数成功:", result3)
# 测试用例4带描边和背景的文本
result4 = add_text_impl(
draft_id=result3['output']['draft_id'],
text="文字描边",
start=4.5,
end=6,
font="思源中宋",
font_color="#FFFFFF", # 白色文字
font_size=24.0,
track_name="text_4",
transform_y=-0.58,
border_color="#FF0000", # 红色描边
border_width=20.0,
border_alpha=1.0,
intro_animation="弹入",
intro_duration=0.5
)
print("测试用例4综合参数成功:", result4)
# 最后保存并上传草稿
if text_result.get('success') and text_result.get('output'):
save_result = save_draft_impl(text_result['output']['draft_id'],draft_folder)
print(f"草稿保存结果: {save_result}")
# 返回最后一个测试结果用于后续操作(如果有的话)
return text_result
def test_image01():
"""Test adding image"""
draft_folder = CAPCUT_DRAFT_FOLDER
print("\nTest: Adding image 1")
image_result = add_image_impl(
image_url="https://cdn.wanx.aliyuncs.com/wanx/1719234057367822001/text_to_image_v2/d6e33c84d7554146a25b1093b012838b_0.png?x-oss-process=image/resize,w_500/watermark,image_aW1nL3dhdGVyMjAyNDExMjkwLnBuZz94LW9zcy1wcm9jZXNzPWltYWdlL3Jlc2l6ZSxtX2ZpeGVkLHdfMTQ1LGhfMjU=,t_80,g_se,x_10,y_10/format,webp",
width=480,
height=480,
start=0,
end=5.0,
transform_y=0.7,
scale_x=2.0,
scale_y=1.0,
transform_x=0,
track_name="main"
)
print(f"Image added successfully! {image_result['output']['draft_id']}")
print(save_draft_impl(image_result['output']['draft_id'], draft_folder))
def test_image02():
"""Test adding multiple images"""
draft_folder = CAPCUT_DRAFT_FOLDER
print("\nTest: Adding image 1")
image_result = add_image_impl(
image_url="https://cdn.wanx.aliyuncs.com/wanx/1719234057367822001/text_to_image_v2/d6e33c84d7554146a25b1093b012838b_0.png?x-oss-process=image/resize,w_500/watermark,image_aW1nL3dhdGVyMjAyNDExMjkwLnBuZz94LW9zcy1wcm9jZXNzPWltYWdlL3Jlc2l6ZSxtX2ZpeGVkLHdfMTQ1LGhfMjU=,t_80,g_se,x_10,y_10/format,webp",
width=480,
height=480,
start=0,
end=5.0,
transform_y=0.7,
scale_x=2.0,
scale_y=1.0,
transform_x=0,
track_name="main"
)
print(f"Image 1 added successfully! {image_result['output']['draft_id']}")
print("\nTest: Adding image 2")
image_result = add_image_impl(
draft_id=image_result['output']['draft_id'],
image_url="https://cdn.wanx.aliyuncs.com/wanx/1719234057367822001/text_to_image_v2/d6e33c84d7554146a25b1093b012838b_0.png?x-oss-process=image/resize,w_500/watermark,image_aW1nL3dhdGVyMjAyNDExMjkwLnBuZz94LW9zcy1wcm9jZXNzPWltYWdlL3Jlc2l6ZSxtX2ZpeGVkLHdfMTQ1LGhfMjU=,t_80,g_se,x_10,y_10/format,webp",
width=480,
height=480,
start=5,
end=10.0,
transform_y=0.7,
scale_x=2.0,
scale_y=1.0,
transform_x=0,
track_name="main"
)
print(f"Image 2 added successfully! {image_result['output']['draft_id']}")
print(save_draft_impl(image_result['output']['draft_id'], draft_folder))
def test_image03():
"""Test adding images to different tracks"""
draft_folder = CAPCUT_DRAFT_FOLDER
print("\nTest: Adding image 1")
image_result = add_image_impl(
image_url="https://cdn.wanx.aliyuncs.com/wanx/1719234057367822001/text_to_image_v2/d6e33c84d7554146a25b1093b012838b_0.png?x-oss-process=image/resize,w_500/watermark,image_aW1nL3dhdGVyMjAyNDExMjkwLnBuZz94LW9zcy1wcm9jZXNzPWltYWdlL3Jlc2l6ZSxtX2ZpeGVkLHdfMTQ1LGhfMjU=,t_80,g_se,x_10,y_10/format,webp",
width=480,
height=480,
start=0,
end=5.0,
transform_y=0.7,
scale_x=2.0,
scale_y=1.0,
transform_x=0,
track_name="main"
)
print(f"Image 1 added successfully! {image_result['output']['draft_id']}")
print("\nTest: Adding image 2")
image_result = add_image_impl(
draft_id=image_result['output']['draft_id'],
image_url="https://cdn.wanx.aliyuncs.com/wanx/1719234057367822001/text_to_image_v2/d6e33c84d7554146a25b1093b012838b_0.png?x-oss-process=image/resize,w_500/watermark,image_aW1nL3dhdGVyMjAyNDExMjkwLnBuZz94LW9zcy1wcm9jZXNzPWltYWdlL3Jlc2l6ZSxtX2ZpeGVkLHdfMTQ1LGhfMjU=,t_80,g_se,x_10,y_10/format,webp",
width=480,
height=480,
start=5,
end=10.0,
transform_y=0.7,
scale_x=2.0,
scale_y=1.0,
transform_x=0,
track_name="main"
)
print(f"Image 2 added successfully! {image_result['output']['draft_id']}")
print("\nTest: Adding image 3")
image_result = add_image_impl(
draft_id=image_result['output']['draft_id'],
image_url="https://cdn.wanx.aliyuncs.com/wanx/1719234057367822001/text_to_image_v2/d6e33c84d7554146a25b1093b012838b_0.png?x-oss-process=image/resize,w_500/watermark,image_aW1nL3dhdGVyMjAyNDExMjkwLnBuZz94LW9zcy1wcm9jZXNzPWltYWdlL3Jlc2l6ZSxtX2ZpeGVkLHdfMTQ1LGhfMjU=,t_80,g_se,x_10,y_10/format,webp",
width=480,
height=480,
start=10,
end=15.0,
transform_y=0.7,
scale_x=2.0,
scale_y=1.0,
transform_x=0,
track_name="main_2" # Use different track name
)
print(f"Image 3 added successfully! {image_result['output']['draft_id']}")
query_draft_status_impl_polling(image_result['output']['draft_id'])
save_draft_impl(image_result['output']['draft_id'], draft_folder)
def test_image04():
"""Test adding image"""
draft_folder = CAPCUT_DRAFT_FOLDER
print("\nTest: Adding image 1")
image_result = add_image_impl(
image_url="https://cdn.wanx.aliyuncs.com/wanx/1719234057367822001/text_to_image_v2/d6e33c84d7554146a25b1093b012838b_0.png?x-oss-process=image/resize,w_500/watermark,image_aW1nL3dhdGVyMjAyNDExMjkwLnBuZz94LW9zcy1wcm9jZXNzPWltYWdlL3Jlc2l6ZSxtX2ZpeGVkLHdfMTQ1LGhfMjU=,t_80,g_se,x_10,y_10/format,webp",
width=480,
height=480,
start=5.0,
end=10.0,
transform_y=0.7,
scale_x=2.0,
scale_y=1.0,
transform_x=0,
track_name="image_main"
)
print(f"Image added successfully! {image_result['output']['draft_id']}")
print(save_draft_impl(image_result['output']['draft_id'], draft_folder))
def test_image05():
"""测试添加图片"""
draft_folder = CAPCUT_DRAFT_FOLDER
print("\n测试添加图片1")
image_result = add_image_impl(
image_url="https://cdn.wanx.aliyuncs.com/wanx/1719234057367822001/text_to_image_v2/d6e33c84d7554146a25b1093b012838b_0.png?x-oss-process=image/resize,w_500/watermark,image_aW1nL3dhdGVyMjAyNDExMjkwLnBuZz94LW9zcy1wcm9jZXNzPWltYWdlL3Jlc2l6ZSxtX2ZpeGVkLHdfMTQ1LGhfMjU=,t_80,g_se,x_10,y_10/format,webp",
width=1920,
height=1080,
start=5.0,
end=10.0,
track_name="image_main",
background_blur=3
)
print(f"添加图片成功!{image_result['output']['draft_id']}")
print(save_draft_impl(image_result['output']['draft_id'], draft_folder))
def test_mask_01():
"""Test adding images to different tracks"""
draft_folder = CAPCUT_DRAFT_FOLDER
print("\nTest: Adding image 1")
image_result = add_image_impl(
image_url="https://cdn.wanx.aliyuncs.com/wanx/1719234057367822001/text_to_image_v2/d6e33c84d7554146a25b1093b012838b_0.png?x-oss-process=image/resize,w_500/watermark,image_aW1nL3dhdGVyMjAyNDExMjkwLnBuZz94LW9zcy1wcm9jZXNzPWltYWdlL3Jlc2l6ZSxtX2ZpeGVkLHdfMTQ1LGhfMjU=,t_80,g_se,x_10,y_10/format,webp",
width=480,
height=480,
start=0,
end=5.0,
transform_y=0.7,
scale_x=2.0,
scale_y=1.0,
transform_x=0,
track_name="main"
)
print(f"Image 1 added successfully! {image_result['output']['draft_id']}")
print("\nTest: Adding image 2")
image_result = add_image_impl(
draft_id=image_result['output']['draft_id'],
image_url="https://cdn.wanx.aliyuncs.com/wanx/1719234057367822001/text_to_image_v2/d6e33c84d7554146a25b1093b012838b_0.png?x-oss-process=image/resize,w_500/watermark,image_aW1nL3dhdGVyMjAyNDExMjkwLnBuZz94LW9zcy1wcm9jZXNzPWltYWdlL3Jlc2l6ZSxtX2ZpeGVkLHdfMTQ1LGhfMjU=,t_80,g_se,x_10,y_10/format,webp",
width=480,
height=480,
start=5,
end=10.0,
transform_y=0.7,
scale_x=2.0,
scale_y=1.0,
transform_x=0,
track_name="main"
)
print(f"Image 2 added successfully! {image_result['output']['draft_id']}")
print("\nTest: Adding image 3")
image_result = add_image_impl(
draft_id=image_result['output']['draft_id'],
image_url="https://cdn.wanx.aliyuncs.com/wanx/1719234057367822001/text_to_image_v2/d6e33c84d7554146a25b1093b012838b_0.png?x-oss-process=image/resize,w_500/watermark,image_aW1nL3dhdGVyMjAyNDExMjkwLnBuZz94LW9zcy1wcm9jZXNzPWltYWdlL3Jlc2l6ZSxtX2ZpeGVkLHdfMTQ1LGhfMjU=,t_80,g_se,x_10,y_10/format,webp",
width=480,
height=480,
start=10,
end=15.0,
transform_y=0.7,
scale_x=2.0,
scale_y=1.0,
transform_x=0,
track_name="main_2", # Use different track name
mask_type="Circle", # Add circular mask
mask_center_x=0.5, # Mask center X coordinate (0.5 means centered)
mask_center_y=0.5, # Mask center Y coordinate (0.5 means centered)
mask_size=0.8, # Mask size (0.8 means 80%)
mask_feather=0.1 # Mask feathering (0.1 means 10%)
)
print(f"Image 3 added successfully! {image_result['output']['draft_id']}")
print(save_draft_impl(image_result['output']['draft_id'], draft_folder))
def test_mask_02():
"""Test adding videos to different tracks"""
# Set draft folder path for saving
draft_folder = CAPCUT_DRAFT_FOLDER
# Define video URL for testing
video_url = "https://cdn.wanx.aliyuncs.com/wanx/1719234057367822001/text_to_video/092faf3c94244973ab752ee1280ba76f.mp4?spm=5176.29623064.0.0.41ed26d6cBOhV3&file=092faf3c94244973ab752ee1280ba76f.mp4"
draft_id = None # Initialize draft_id
# Add video to first track
video_result = add_video_impl(
draft_id=draft_id, # Pass in draft_id
video_url=video_url,
width=1920,
height=1080,
start=0,
end=5.0, # Use first 5 seconds of video
target_start=0,
track_name="main_video_track"
)
draft_id = video_result['output']['draft_id'] # Update draft_id
print(f"First video addition result: {video_result}")
# Add video to second track
video_result = add_video_impl(
draft_id=draft_id, # Use previous draft_id
video_url=video_url,
width=1920,
height=1080,
start=0,
end=5.0, # Use first 5 seconds of video
target_start=0,
track_name="main_video_track_2", # Use different track name
speed=1.0, # Change playback speed
scale_x=0.5, # Reduce video width
transform_y=0.5 # Place video at bottom of screen
)
draft_id = video_result['output']['draft_id'] # Update draft_id
print(f"Second video addition result: {video_result}")
# Third time add video to another track with circular mask
video_result = add_video_impl(
draft_id=draft_id, # Use previous draft_id
video_url=video_url,
width=1920,
height=1080,
start=0,
end=5.0, # Use first 5 seconds of video
target_start=0,
track_name="main_video_track_3", # Use third track
speed=1.5, # Faster playback speed
scale_x=0.3, # Smaller video width
transform_y=-0.5, # Place video at top of screen
mask_type="Circle", # Add circular mask
mask_center_x=0.5, # Mask center X coordinate
mask_center_y=0.5, # Mask center Y coordinate
mask_size=0.8, # Mask size
mask_feather=0.1 # Mask feathering
)
draft_id = video_result['output']['draft_id'] # Update draft_id
print(f"Third video addition result: {video_result}")
# Finally save and upload draft
save_result = save_draft_impl(draft_id, draft_folder)
print(f"Draft save result: {save_result}")
def test_audio01():
"""Test adding audio"""
draft_folder = CAPCUT_DRAFT_FOLDER
print("\nTest: Adding audio")
audio_result = add_audio_track(
audio_url="https://lf3-lv-music-tos.faceu.com/obj/tos-cn-ve-2774/oYACBQRCMlWBIrZipvQZhI5LAlUFYii0RwEPh",
start=4,
end=5,
target_start=15,
volume=0.8,
speed=1.0,
track_name="main_audio101",
# effect_type="麦霸",
effect_type="Tremble",
effect_params=[90.0, 50.0]
)
print(f"Audio addition result: {audio_result}")
print(save_draft_impl(audio_result['output']['draft_id'], draft_folder))
def test_audio02():
"""Test adding multiple audio segments"""
draft_folder = CAPCUT_DRAFT_FOLDER
print("\nTest: Adding audio 1")
audio_result = add_audio_track(
audio_url="https://lf3-lv-music-tos.faceu.com/obj/tos-cn-ve-2774/oYACBQRCMlWBIrZipvQZhI5LAlUFYii0RwEPh",
start=4,
end=5,
target_start=0,
volume=0.8,
speed=1.0,
track_name="main_audio101",
# effect_type="麦霸",
effect_type="Tremble",
effect_params=[90.0, 50.0]
)
print(f"Audio addition result 1: {audio_result}")
print("\nTest: Adding audio 2")
audio_result = add_audio_track(
draft_id=audio_result['output']['draft_id'],
audio_url="https://lf3-lv-music-tos.faceu.com/obj/tos-cn-ve-2774/oYACBQRCMlWBIrZipvQZhI5LAlUFYii0RwEPh",
start=4,
end=5,
target_start=1.5,
volume=0.8,
speed=1.0,
track_name="main_audio101",
# effect_type="麦霸",
effect_type="Tremble",
effect_params=[90.0, 50.0]
)
print(f"Audio addition result 2: {audio_result}")
print(save_draft_impl(audio_result['output']['draft_id'], draft_folder))
def test_audio03():
"""Test adding audio in a loop"""
draft_folder = CAPCUT_DRAFT_FOLDER
draft_id = None # Initialize draft_id
for i in range(10):
target_start = i * 1.5 # Increment by 1.5 seconds each time
audio_result = add_audio_track(
audio_url="https://lf3-lv-music-tos.faceu.com/obj/tos-cn-ve-2774/oYACBQRCMlWBIrZipvQZhI5LAlUFYii0RwEPh",
start=4,
end=5,
target_start=target_start,
volume=0.8,
speed=1.0,
track_name="main_audio101",
# effect_type="麦霸",
effect_type="Tremble",
effect_params=[90.0, 50.0],
draft_id=draft_id # Pass the previous draft_id (None for the first time)
)
draft_id = audio_result['output']['draft_id'] # Update draft_id
print(f"Audio addition result {i+1}: {audio_result}")
# Finally save and upload draft
save_result = save_draft_impl(draft_id, draft_folder)
print(f"Draft save result: {save_result}")
def test_audio04():
"""Test adding audio to different tracks"""
draft_folder = CAPCUT_DRAFT_FOLDER
print("\nTest: Adding audio 1")
audio_result = add_audio_track(
audio_url="https://lf3-lv-music-tos.faceu.com/obj/tos-cn-ve-2774/oYACBQRCMlWBIrZipvQZhI5LAlUFYii0RwEPh",
start=4,
end=5,
target_start=0,
volume=0.8,
speed=1.0,
track_name="main_audio101",
# effect_type="麦霸",
effect_type="Tremble",
effect_params=[90.0, 50.0]
)
print(f"Audio addition result 1: {audio_result}")
print("\nTest: Adding audio 2")
audio_result = add_audio_track(
draft_id=audio_result['output']['draft_id'],
audio_url="https://lf3-lv-music-tos.faceu.com/obj/tos-cn-ve-2774/oYACBQRCMlWBIrZipvQZhI5LAlUFYii0RwEPh",
start=4,
end=5,
target_start=1.5,
volume=0.8,
speed=1.0,
track_name="main_audio102", # Use different track name
# effect_type="麦霸",
effect_type="Tremble",
effect_params=[90.0, 50.0]
)
print(f"Audio addition result 2: {audio_result}")
query_draft_status_impl_polling(audio_result['output']['draft_id'])
save_draft_impl(audio_result['output']['draft_id'], draft_folder)
def add_subtitle_impl(srt, draft_id=None, time_offset=0.0, font_size=5.0, font = "思源粗宋",
bold=False, italic=False, underline=False, font_color="#ffffff",
transform_x=0.0, transform_y=0.0, scale_x=1.0, scale_y=1.0,
vertical=False, track_name="subtitle", alpha=1,
border_alpha=1.0, border_color="#000000", border_width=0.0,
background_color="#000000", background_style=1, background_alpha=0.0,
rotation=0.0, width=1080, height=1920):
"""API wrapper for add_subtitle service"""
data = {
"license_key": LICENSE_KEY, # Using trial version license key
"srt": srt, # Modified parameter name to match server side
"draft_id": draft_id,
"time_offset": time_offset,
"font": font,
"font_size": font_size,
"bold": bold,
"italic": italic,
"underline": underline,
"font_color": font_color,
"transform_x": transform_x,
"transform_y": transform_y,
"scale_x": scale_x,
"scale_y": scale_y,
"vertical": vertical,
"track_name": track_name,
"alpha": alpha,
"border_alpha": border_alpha,
"border_color": border_color,
"border_width": border_width,
"background_color": background_color,
"background_style": background_style,
"background_alpha": background_alpha,
"rotation": rotation,
"width": width,
"height": height
}
return make_request("add_subtitle", data)
def save_draft_impl(draft_id, draft_folder):
"""API wrapper for save_draft service"""
data = {
"license_key": LICENSE_KEY, # Using trial version license key
"draft_id": draft_id,
"draft_folder": draft_folder
}
return make_request("save_draft", data)
def query_script_impl(draft_id):
"""API wrapper for query_script service"""
data = {
"draft_id": draft_id
}
return make_request("query_script", data)
def query_draft_status_impl(task_id):
"""API wrapper for query_draft_status service"""
data = {
"license_key": LICENSE_KEY, # Using trial version license key
"task_id": task_id
}
return make_request("query_draft_status", data)
def query_draft_status_impl_polling(task_id, timeout=300, callback=None):
"""
Poll for draft download status, implemented with async thread to avoid blocking the main thread
:param task_id: task ID returned by save_draft_impl
:param timeout: timeout in seconds, default 5 minutes
:param callback: optional callback function called when task completes, fails or times out, with final status as parameter
:return: tuple of thread object and result container, can be used to get results later
"""
# Create result container to store final result
result_container = {"result": None}
def _polling_thread():
start_time = time.time()
print(f"Starting to query status for task {task_id}...")
while True:
try:
# Get current task status
task_status = query_draft_status_impl(task_id).get("output", {})
# Print current status
status = task_status.get("status", "unknown")
message = task_status.get("message", "")
progress = task_status.get("progress", 0)
print(f"Current status: {status}, progress: {progress}%, message: {message}")
# Check if completed or failed
if status == "completed":
print(f"Task completed! Draft URL: {task_status.get('draft_url', 'Not provided')}")
result_container["result"] = task_status.get('draft_url', 'Not provided')
if callback:
callback(task_status.get('draft_url', 'Not provided'))
break
elif status == "failed":
print(f"Task failed: {message}")
result_container["result"] = task_status
if callback:
callback(task_status)
break
elif status == "not_found":
print(f"Task does not exist: {task_id}")
result_container["result"] = task_status
if callback:
callback(task_status)
break
# Check if timed out
elapsed_time = time.time() - start_time
if elapsed_time > timeout:
print(f"Query timed out, waited {timeout} seconds")
result_container["result"] = task_status
if callback:
callback(task_status)
break
except Exception as e:
# Catch all exceptions to prevent thread crash
print(f"Exception occurred during query: {e}")
time.sleep(1) # Wait 1 second before retrying after error
continue
# Wait 1 second before querying again
time.sleep(1)
# Create and start thread
thread = threading.Thread(target=_polling_thread)
# thread.daemon = True # Set as daemon thread, automatically terminates when main thread ends
thread.start()
# Return thread object and result container for external code to get results
return thread, result_container
def test_subtitle():
draft_folder = CAPCUT_DRAFT_FOLDER
# Test case: Add text subtitles
print("\nTest: Adding text subtitles")
text_result = add_subtitle_impl(
srt="1\n00:00:00,000 --> 00:00:04,433\nHello, I am the CapCut draft assistant developed by Sun Guannan.\n\n2\n00:00:04,433 --> 00:00:11,360\nI specialize in combining audio, video, and image materials to create CapCut drafts.\n",
font_size=8.0,
bold=True,
italic=True,
underline=True,
font_color="#FF0000",
transform_y=0,
transform_x=0.4,
time_offset=42,
scale_x=1.0,
scale_y=2.0,
vertical=True,
# Add background color parameters
background_color="#FFFF00", # Yellow background
background_style=1, # Style 1 means rectangular background
background_alpha=0.7, # 70% opacity
# Add border parameters
border_color="#0000FF", # Blue border
border_width=20.0, # Border width 2
border_alpha=1.0 # Fully opaque
)
print(f"Text addition result: {text_result}")
# Save draft
if text_result.get('success') and text_result.get('output'):
save_result = save_draft_impl(text_result['output']['draft_id'], draft_folder)
print(f"Draft save result: {save_result}")
def test01():
draft_folder = CAPCUT_DRAFT_FOLDER
# Combined test
print("\nTest 2: Add audio")
audio_result = add_audio_track(
audio_url = "https://lf3-lv-music-tos.faceu.com/obj/tos-cn-ve-2774/oYACBQRCMlWBIrZipvQZhI5LAlUFYii0RwEPh",
start=4,
end=5,
target_start=2,
volume=0.8,
speed=1.0,
track_name="main_audio100",
effect_type="Tremble",
effect_params=[90.0, 50.0]
)
print(f"Audio addition result 1: {audio_result}")
audio_result = add_audio_track(
draft_id=audio_result['output']['draft_id'],
audio_url = "https://lf3-lv-music-tos.faceu.com/obj/tos-cn-ve-2774/oYACBQRCMlWBIrZipvQZhI5LAlUFYii0RwEPh",
start=4,
end=5,
target_start=4,
volume=0.8,
speed=1.0,
track_name="main_audio100",
effect_type="Tremble",
effect_params=[90.0, 50.0]
)
print(f"Audio addition result 2: {audio_result}")
audio_result = add_audio_track(
draft_id=audio_result['output']['draft_id'],
audio_url = "https://lf3-lv-music-tos.faceu.com/obj/tos-cn-ve-2774/oYACBQRCMlWBIrZipvQZhI5LAlUFYii0RwEPh",
start=4,
end=5,
target_start=6,
volume=0.8,
speed=1.0,
track_name="main_audio101",
effect_type="Tremble",
effect_params=[90.0, 50.0]
)
print(f"Audio addition result 3: {audio_result}")
# Test case 1: Basic text addition
text_result = add_text_impl(
draft_folder=draft_folder,
text="Test Text 1",
draft_id=audio_result['output']['draft_id'],
start=0,
end=3,
font="思源中宋", # Use Source Han Serif font
font_color="#FF0000", # Red
track_name="main_text",
transform_y=0.8,
transform_x=0.5,
font_size=30.0
)
print("Test case 1 (Basic text) successful:", text_result)
# Test case 2: Vertical text
result2 = add_text_impl(
draft_id=text_result['output']['draft_id'],
text="Vertical Text Test",
start=3,
end=6,
font="云书法三行魏碑体",
font_color="#00FF00", # Green
font_size=8.0,
track_name="main_text",
vertical=True, # Enable vertical text
transform_y=-0.5,
outro_animation='Fade_Out'
)
print("Test case 2 (Vertical text) successful:", result2)
print("Test completed")
# Test adding image
image_result = add_image_impl(
draft_id=result2['output']['draft_id'], # Replace with actual draft ID
image_url="https://cdn.wanx.aliyuncs.com/wanx/1719234057367822001/text_to_image_v2/d6e33c84d7554146a25b1093b012838b_0.png?x-oss-process=image/resize,w_500/watermark,image_aW1nL3dhdGVyMjAyNDExMjkwLnBuZz94LW9zcy1wcm9jZXNzPWltYWdlL3Jlc2l6ZSxtX2ZpeGVkLHdfMTQ1LGhfMjU=,t_80,g_se,x_10,y_10/format,webp", # Replace with actual image URL
width=480,
height=480,
start = 0,
end=5.0, # Display for 5 seconds
transform_y=0.7,
scale_x=2.0,
scale_y=1.0,
transform_x=0,
track_name="main"
)
print("Image added successfully!")
# Test adding image
image_result = add_image_impl(
draft_id=result2['output']['draft_id'], # Replace with actual draft ID
image_url="http://gips0.baidu.com/it/u=3602773692,1512483864&fm=3028&app=3028&f=JPEG&fmt=auto?w=960&h=1280", # Replace with actual image URL
width=480,
height=480,
start = 0,
end=5.0, # Display for 5 seconds
transform_y=0.7,
scale_x=2.0,
scale_y=1.0,
transform_x=0,
track_name="main_2"
)
print("Image added successfully!")
image_result = add_image_impl(
draft_id=image_result['output']['draft_id'], # Replace with actual draft ID
image_url="https://cdn.wanx.aliyuncs.com/wanx/1719234057367822001/text_to_image_v2/d6e33c84d7554146a25b1093b012838b_0.png?x-oss-process=image/resize,w_500/watermark,image_aW1nL3dhdGVyMjAyNDExMjkwLnBuZz94LW9zcy1wcm9jZXNzPWltYWdlL3Jlc2l6ZSxtX2ZpeGVkLHdfMTQ1LGhfMjU=,t_80,g_se,x_10,y_10/format,webp", # Replace with actual image URL
width=480,
height=480,
start = 5,
end=10.0, # Display for 5 seconds
transform_y=0.7,
scale_x=2.0,
scale_y=1.0,
transform_x=0,
track_name="main"
)
print("Image 2 added successfully!")
# Test adding video keyframe
print("\nTest: Add video keyframe")
keyframe_result = add_video_keyframe_impl(
draft_id=image_result['output']['draft_id'], # Use existing draft ID
track_name="main",
property_type="position_y", # Test opacity
time=1.5, # Add keyframe at 3.5 seconds
value="0.2" # Move 300px
)
print(f"Keyframe addition result: {keyframe_result}")
print("\nTest: Add video keyframe")
keyframe_result = add_video_keyframe_impl(
draft_id=image_result['output']['draft_id'], # Use existing draft ID
track_name="main",
property_type="position_y", # Test opacity
time=3.5, # Add keyframe at 3.5 seconds
value="0.4" # Move 300px
)
print(f"Keyframe addition result: {keyframe_result}")
query_draft_status_impl_polling(keyframe_result['output']['draft_id'])
save_draft_impl(keyframe_result['output']['draft_id'], draft_folder)
def test02():
draft_folder = CAPCUT_DRAFT_FOLDER
# Combined test
print("\nTest 2: Add audio")
audio_result = add_audio_track(
audio_url = "https://lf3-lv-music-tos.faceu.com/obj/tos-cn-ve-2774/oYACBQRCMlWBIrZipvQZhI5LAlUFYii0RwEPh",
start=4,
end=5,
target_start=2,
volume=0.8,
speed=1.0,
track_name="main_audio100",
effect_type = "Big_House",
effect_params = [50.0]
)
print(f"Audio addition result 1: {audio_result}")
audio_result = add_audio_track(
draft_id=audio_result['output']['draft_id'],
audio_url = "https://lf3-lv-music-tos.faceu.com/obj/tos-cn-ve-2774/oYACBQRCMlWBIrZipvQZhI5LAlUFYii0RwEPh",
start=4,
end=5,
target_start=4,
volume=0.8,
speed=1.0,
track_name="main_audio100",
effect_type = "Big_House",
effect_params = [50.0]
)
print(f"Audio addition result 2: {audio_result}")
audio_result = add_audio_track(
draft_id=audio_result['output']['draft_id'],
audio_url = "https://lf3-lv-music-tos.faceu.com/obj/tos-cn-ve-2774/oYACBQRCMlWBIrZipvQZhI5LAlUFYii0RwEPh",
start=4,
end=5,
target_start=6,
volume=0.8,
speed=1.0,
track_name="main_audio101",
effect_type = "Big_House",
effect_params = [50.0]
)
print(f"Audio addition result 3: {audio_result}")
# Test case 1: Basic text addition
text_result = add_text_impl(
draft_folder=draft_folder,
text="Test Text 1",
draft_id=audio_result['output']['draft_id'],
start=0,
end=3,
font="思源中宋", # Use Source Han Serif font
font_color="#FF0000", # Red
track_name="main_text",
transform_y=0.8,
transform_x=0.5,
font_size=30.0
)
print("Test case 1 (Basic text) successful:", text_result)
# Test case 2: Vertical text
result2 = add_text_impl(
draft_id=text_result['output']['draft_id'],
text="Vertical Text Test",
start=3,
end=6,
font="云书法三行魏碑体",
font_color="#00FF00", # Green
font_size=8.0,
track_name="main_text",
vertical=True, # Enable vertical text
transform_y=-0.5,
outro_animation='Throw_Back'
)
print("Test case 2 (Vertical text) successful:", result2)
print("Test completed")
# Test adding image
image_result = add_image_impl(
draft_id=result2['output']['draft_id'], # Replace with actual draft ID
image_url="https://cdn.wanx.aliyuncs.com/wanx/1719234057367822001/text_to_image_v2/d6e33c84d7554146a25b1093b012838b_0.png?x-oss-process=image/resize,w_500/watermark,image_aW1nL3dhdGVyMjAyNDExMjkwLnBuZz94LW9zcy1wcm9jZXNzPWltYWdlL3Jlc2l6ZSxtX2ZpeGVkLHdfMTQ1LGhfMjU=,t_80,g_se,x_10,y_10/format,webp", # Replace with actual image URL
width=480,
height=480,
start = 0,
end=5.0, # Display for 5 seconds
transform_y=0.7,
scale_x=2.0,
scale_y=1.0,
transform_x=0,
track_name="main"
)
print("Image added successfully!")
# Test adding image
image_result = add_image_impl(
draft_id=result2['output']['draft_id'], # Replace with actual draft ID
image_url="http://gips0.baidu.com/it/u=3602773692,1512483864&fm=3028&app=3028&f=JPEG&fmt=auto?w=960&h=1280", # Replace with actual image URL
width=480,
height=480,
start = 0,
end=5.0, # Display for 5 seconds
transform_y=0.7,
scale_x=2.0,
scale_y=1.0,
transform_x=0,
track_name="main_2"
)
print("Image added successfully!")
image_result = add_image_impl(
draft_id=image_result['output']['draft_id'], # Replace with actual draft ID
image_url="https://cdn.wanx.aliyuncs.com/wanx/1719234057367822001/text_to_image_v2/d6e33c84d7554146a25b1093b012838b_0.png?x-oss-process=image/resize,w_500/watermark,image_aW1nL3dhdGVyMjAyNDExMjkwLnBuZz94LW9zcy1wcm9jZXNzPWltYWdlL3Jlc2l6ZSxtX2ZpeGVkLHdfMTQ1LGhfMjU=,t_80,g_se,x_10,y_10/format,webp", # Replace with actual image URL
width=480,
height=480,
start = 5,
end=10.0, # Display for 5 seconds
transform_y=0.7,
scale_x=2.0,
scale_y=1.0,
transform_x=0,
track_name="main"
)
print("Image 2 added successfully!")
# Test adding video keyframe
print("\nTest: Add video keyframe")
keyframe_result = add_video_keyframe_impl(
draft_id=image_result['output']['draft_id'], # Use existing draft ID
track_name="main",
property_type="position_y", # Test opacity
time=1.5, # Add keyframe at 3.5 seconds
value="0.2" # Move 300px
)
print(f"Keyframe addition result: {keyframe_result}")
print("\nTest: Add video keyframe")
keyframe_result = add_video_keyframe_impl(
draft_id=image_result['output']['draft_id'], # Use existing draft ID
track_name="main",
property_type="position_y", # Test opacity
time=3.5, # Add keyframe at 3.5 seconds
value="0.4" # Move 300px
)
print(f"Keyframe addition result: {keyframe_result}")
query_draft_status_impl_polling(keyframe_result['output']['draft_id'])
save_draft_impl(keyframe_result['output']['draft_id'], draft_folder)
def test_video_track01():
"""Test adding video track"""
draft_folder = CAPCUT_DRAFT_FOLDER
video_url = "https://cdn.wanx.aliyuncs.com/wanx/1719234057367822001/text_to_video/092faf3c94244973ab752ee1280ba76f.mp4?spm=5176.29623064.0.0.41ed26d6cBOhV3&file=092faf3c94244973ab752ee1280ba76f.mp4" # Replace with actual video URL
print("\nTest: Add video track")
video_result = add_video_impl(
video_url=video_url,
width=1920,
height=1080,
start=0,
end=5.0, # Cut the first 5 seconds of the video
target_start=0,
track_name="main_video_track"
)
print(f"Video track addition result: {video_result}")
if video_result and 'output' in video_result and 'draft_id' in video_result['output']:
draft_id = video_result['output']['draft_id']
print(f"Save draft: {save_draft_impl(draft_id, draft_folder)}")
else:
print("Unable to get draft ID, skipping save operation.")
def test_video_track02():
"""Test adding video tracks in a loop"""
draft_folder = CAPCUT_DRAFT_FOLDER
video_url = "https://cdn.wanx.aliyuncs.com/wanx/1719234057367822001/text_to_video/092faf3c94244973ab752ee1280ba76f.mp4?spm=5176.29623064.0.0.41ed26d6cBOhV3&file=092faf3c94244973ab752ee1280ba76f.mp4" # Replace with actual video URL
draft_id = None # Initialize draft_id
for i in range(5):
target_start = i * 5 # Increment by 5 seconds each time
video_result = add_video_impl(
draft_id=draft_id, # Pass in draft_id
video_url=video_url,
width=1920,
height=1080,
start=0,
end=5.0, # Cut the first 5 seconds of the video
target_start=target_start,
track_name="main_video_track"
)
draft_id = video_result['output']['draft_id'] # Update draft_id
print(f"Video addition result {i+1}: {video_result}")
# Finally save and upload the draft
save_result = save_draft_impl(draft_id, draft_folder)
print(f"Draft save result: {save_result}")
def test_video_track03():
"""Test adding videos to different tracks"""
draft_folder = CAPCUT_DRAFT_FOLDER
video_url = "https://cdn.wanx.aliyuncs.com/wanx/1719234057367822001/text_to_video/092faf3c94244973ab752ee1280ba76f.mp4?spm=5176.29623064.0.0.41ed26d6cBOhV3&file=092faf3c94244973ab752ee1280ba76f.mp4" # Replace with actual video URL
draft_id = None # Initialize draft_id
# Add video to the first track
video_result = add_video_impl(
draft_id=draft_id, # Pass in draft_id
video_url=video_url,
width=1920,
height=1080,
start=0,
end=5.0, # Cut the first 5 seconds of the video
target_start=0,
track_name="main_video_track"
)
draft_id = video_result['output']['draft_id'] # Update draft_id
print(f"First video addition result: {video_result}")
# Add video to the second track
video_result = add_video_impl(
draft_id=draft_id, # Use previous draft_id
video_url=video_url,
width=1920,
height=1080,
start=0,
end=5.0, # Cut the first 5 seconds of the video
target_start=0,
track_name="main_video_track_2", # Use different track name
speed=1.0, # Change playback speed
scale_x=0.5, # Reduce video width
transform_y=0.5 # Position video at bottom of screen
)
draft_id = video_result['output']['draft_id'] # Update draft_id
print(f"Second video addition result: {video_result}")
# Third time add video to another track
video_result = add_video_impl(
draft_id=draft_id, # Use previous draft_id
video_url=video_url,
width=1920,
height=1080,
start=0,
end=5.0, # Cut the first 5 seconds of the video
target_start=0,
track_name="main_video_track_3", # Use third track
speed=1.5, # Faster playback speed
scale_x=0.3, # Smaller video width
transform_y=-0.5 # Position video at top of screen
)
draft_id = video_result['output']['draft_id'] # Update draft_id
print(f"Third video addition result: {video_result}")
# Finally save and upload the draft
save_result = save_draft_impl(draft_id, draft_folder)
print(f"Draft save result: {save_result}")
def test_video_track04():
"""Test adding video track"""
draft_folder = CAPCUT_DRAFT_FOLDER
video_url = "https://cdn.wanx.aliyuncs.com/wanx/1719234057367822001/text_to_video/092faf3c94244973ab752ee1280ba76f.mp4?spm=5176.29623064.0.0.41ed26d6cBOhV3&file=092faf3c94244973ab752ee1280ba76f.mp4" # Replace with actual video URL
print("\nTest: Add video track")
video_result = add_video_impl(
video_url='https://p26-bot-workflow-sign.byteimg.com/tos-cn-i-mdko3gqilj/07bf6797a1834d75beb05c63293af204.mp4~tplv-mdko3gqilj-image.image?rk3s=81d4c505&x-expires=1782141919&x-signature=2ETX83Swh%2FwKzHeWB%2F9oGq9vqt4%3D&x-wf-file_name=output-997160b5.mp4'
)
print(f"Video track addition result: {video_result}")
print("\nTest: Add video track")
video_result = add_video_impl(
video_url='https://cdn.wanx.aliyuncs.com/wanx/1719234057367822001/text_to_video/092faf3c94244973ab752ee1280ba76f.mp4?spm=5176.29623064.0.0.41ed26d6cBOhV3&file=092faf3c94244973ab752ee1280ba76f.mp4',
draft_id=video_result['output']['draft_id'], # Use existing draft ID
target_start=19.84
)
print(f"Video track addition result: {video_result}")
if video_result and 'output' in video_result and 'draft_id' in video_result['output']:
draft_id = video_result['output']['draft_id']
print(f"Save draft: {save_draft_impl(draft_id, draft_folder)}")
else:
print("Unable to get draft ID, skipping save operation.")
def test_video_track05():
"""测试添加视频轨道"""
draft_folder = CAPCUT_DRAFT_FOLDER
video_url = "https://cdn.wanx.aliyuncs.com/wanx/1719234057367822001/text_to_video/092faf3c94244973ab752ee1280ba76f.mp4?spm=5176.29623064.0.0.41ed26d6cBOhV3&file=092faf3c94244973ab752ee1280ba76f.mp4" # 替换为实际视频URL
print("\n测试:添加视频轨道")
video_result = add_video_impl(
video_url='https://p26-bot-workflow-sign.byteimg.com/tos-cn-i-mdko3gqilj/07bf6797a1834d75beb05c63293af204.mp4~tplv-mdko3gqilj-image.image?rk3s=81d4c505&x-expires=1782141919&x-signature=2ETX83Swh%2FwKzHeWB%2F9oGq9vqt4%3D&x-wf-file_name=output-997160b5.mp4',
background_blur=2,
width=1920,
height=1080
)
print(f"视频轨道添加结果: {video_result}")
if video_result and 'output' in video_result and 'draft_id' in video_result['output']:
draft_id = video_result['output']['draft_id']
print(f"保存草稿: {save_draft_impl(draft_id, draft_folder)}")
else:
print("无法获取草稿ID跳过保存操作。")
def test_keyframe():
"""Test adding keyframes"""
draft_folder = CAPCUT_DRAFT_FOLDER
draft_id = None # Initialize draft_id
print("\nTest: Add basic video track")
video_result = add_video_impl(
video_url="https://cdn.wanx.aliyuncs.com/wanx/1719234057367822001/text_to_video/092faf3c94244973ab752ee1280ba76f.mp4?spm=5176.29623064.0.0.41ed26d6cBOhV3&file=092faf3c94244973ab752ee1280ba76f.mp4",
width=1920,
height=1080,
start=0,
end=10.0,
target_start=0,
track_name="main_video_track"
)
print("Video addition result:", video_result)
if video_result.get('success') and video_result.get('output'):
draft_id = video_result['output']['draft_id']
print("Using existing draft_id:", draft_id)
else:
print("Unable to get draft ID, terminating test.")
return
print("\nTest: Add opacity keyframe")
keyframe_result = add_video_keyframe_impl(
draft_id=draft_id,
track_name="main_video_track",
property_type="alpha",
time=2.0,
value="1.0"
)
print("Opacity keyframe addition result:", keyframe_result)
print("\nTest: Add position Y keyframe")
keyframe_result = add_video_keyframe_impl(
draft_id=draft_id,
track_name="main_video_track",
property_type="position_y",
time=2.0,
value="0.5"
)
print("Position Y keyframe addition result:", keyframe_result)
print("\nTest: Add scale X keyframe")
keyframe_result = add_video_keyframe_impl(
draft_id=draft_id,
track_name="main_video_track",
property_type="position_y",
time=4.0,
value="-0.5"
)
print("Scale X keyframe addition result:", keyframe_result)
print("\nFinal draft save")
save_result = save_draft_impl(draft_id, draft_folder)
print(f"Draft save result: {save_result}")
def test_keyframe_02():
"""Test adding keyframes - Batch adding to implement fade-in and zoom bounce effects"""
draft_folder = CAPCUT_DRAFT_FOLDER
draft_id = None # Initialize draft_id
print("\nTest: Adding basic video track")
video_result = add_video_impl(
video_url="https://cdn.wanx.aliyuncs.com/wanx/1719234057367822001/text_to_video/092faf3c94244973ab752ee1280ba76f.mp4?spm=5176.29623064.0.0.41ed26d6cBOhV3&file=092faf3c94244973ab752ee1280ba76f.mp4",
width=1920,
height=1080,
start=0,
end=10.0,
target_start=0,
track_name="main_video_track"
)
print("Video adding result:", video_result)
if video_result.get('success') and video_result.get('output'):
draft_id = video_result['output']['draft_id']
print("Using existing draft_id:", draft_id)
else:
print("Unable to get draft ID, terminating test.")
return
print("\nTest: Batch adding opacity keyframes - Implementing fade-in effect")
# Add opacity keyframes to implement fade-in effect from invisible to visible
alpha_keyframe_result = add_video_keyframe_impl(
draft_id=draft_id,
track_name="main_video_track",
property_types=["alpha", "alpha", "alpha", "alpha"],
times=[0.0, 1.0, 2.0, 3.0],
values=["0.0", "0.3", "0.7", "1.0"]
)
print("Opacity keyframe batch adding result:", alpha_keyframe_result)
print("\nTest: Batch adding scale keyframes - Implementing zoom bounce effect")
# Add uniform scale keyframes to implement zoom bounce effect
scale_keyframe_result = add_video_keyframe_impl(
draft_id=draft_id,
track_name="main_video_track",
property_types=["uniform_scale", "uniform_scale", "uniform_scale", "uniform_scale", "uniform_scale"],
times=[0.0, 1.5, 3.0, 4.5, 6.0],
values=["0.8", "1.3", "1.0", "1.2", "1.0"]
)
print("Scale keyframe batch adding result:", scale_keyframe_result)
print("\nTest: Batch adding position Y keyframes - Implementing up and down floating effect")
# Add position Y keyframes to implement up and down floating effect
position_y_keyframe_result = add_video_keyframe_impl(
draft_id=draft_id,
track_name="main_video_track",
property_types=["position_y", "position_y", "position_y", "position_y"],
times=[2.0, 3.5, 5.0, 6.5],
values=["0.0", "0.2", "-0.2", "0.0"]
)
print("Position Y keyframe batch adding result:", position_y_keyframe_result)
print("\nFinal draft saving")
save_result = save_draft_impl(draft_id, draft_folder)
print(f"Draft saving result: {save_result}")
def test_subtitle_01():
"""Test adding text subtitles"""
draft_folder = CAPCUT_DRAFT_FOLDER
print("\nTest 3: Adding text subtitles")
text_result = add_subtitle_impl(
srt="1\n00:00:00,000 --> 00:00:04,433\n你333好我是孙关南开发的剪映草稿助手。\n\n2\n00:00:04,433 --> 00:00:11,360\n我擅长将音频、视频、图片素材拼接在一起剪辑输出剪映草稿。\n",
font_size=8.0,
bold=True,
italic=True,
underline=True,
font_color="#FF0000",
transform_y=0,
transform_x=0.4,
time_offset=42,
scale_x=1.0,
scale_y=2.0,
vertical=True
)
print(f"Text adding result: {text_result}")
if text_result.get('success') and text_result.get('output'):
save_result = save_draft_impl(text_result['output']['draft_id'], draft_folder)
print(f"Draft saving result: {save_result}")
return text_result
def test_subtitle_02():
"""Test adding text subtitles via SRT URL"""
draft_folder = CAPCUT_DRAFT_FOLDER
print("\nTest 3: Adding text subtitles (from URL)")
text_result = add_subtitle_impl(
srt="https://oss-oversea-bucket.oss-cn-hongkong.aliyuncs.com/dfd_srt_1748575460_kmtu56iu.srt?Expires=1748707452&OSSAccessKeyId=TMP.3Km5TL5giRLgDkc3CamKPcWZTmSrLVeRxPWxEisNB2CTymvUxrpX8VXzy5r99F6bJkwjwFM5d1RsiV3cF18iaMriAPtA1y&Signature=4JzB4YGiChsxcTFuvUyZ0v3MjMI%3D",
font_size=8.0,
bold=True,
italic=True,
underline=True,
font_color="#FF0000",
transform_y=0,
transform_x=0.4,
time_offset=42,
scale_x=1.0,
scale_y=2.0,
vertical=True
)
print(f"Text adding result: {text_result}")
if text_result.get('success') and text_result.get('output'):
save_result = save_draft_impl(text_result['output']['draft_id'], draft_folder)
print(f"Draft saving result: {save_result}")
return text_result
def test_video_01():
"""Test adding single video with transform and speed parameters"""
# Set draft folder path for saving
draft_folder = CAPCUT_DRAFT_FOLDER
print("\nTest: Adding video")
video_result = add_video_impl(
video_url="https://cdn.wanx.aliyuncs.com/wanx/1719234057367822001/text_to_video/092faf3c94244973ab752ee1280ba76f.mp4?spm=5176.29623064.0.0.41ed26d6cBOhV3&file=092faf3c94244973ab752ee1280ba76f.mp4", # Replace with actual video URL
start=0,
end=5,
width=1920,
height=1080,
track_name="main_video",
transform_y=0.1,
scale_x=0.8,
scale_y=0.8,
transform_x=0.1,
speed=1.2,
target_start=0,
relative_index=0
)
print(f"Video adding result: {video_result}")
# Save draft
if video_result.get('success') and video_result.get('output'):
query_draft_status_impl_polling(video_result['output']['draft_id'])
save_draft_impl(video_result['output']['draft_id'], draft_folder)
def test_video_02():
"""Test adding multiple videos with different resolutions to the same draft"""
# Set draft folder path for saving
draft_folder = CAPCUT_DRAFT_FOLDER
print("\nTest: Adding video")
video_result = add_video_impl(
video_url="https://cdn.wanx.aliyuncs.com/wanx/1719234057367822001/text_to_video/092faf3c94244973ab752ee1280ba76f.mp4?spm=5176.29623064.0.0.41ed26d6cBOhV3&file=092faf3c94244973ab752ee1280ba76f.mp4", # Replace with actual video URL
start=0,
end=5,
width=1920,
height=1080,
track_name="main_video",
transform_y=0.1,
scale_x=0.8,
scale_y=0.8,
transform_x=0.1,
speed=1.2,
target_start=0,
relative_index=0
)
print(f"Video adding result: {video_result}")
video_result = add_video_impl(
video_url="https://videos.pexels.com/video-files/3129769/3129769-hd_1280_720_30fps.mp4", # Replace with actual video URL
draft_id=video_result['output']['draft_id'],
start=0,
end=5,
width=1920,
height=1080,
track_name="main_video_2",
transform_y=0.1,
scale_x=0.8,
scale_y=0.8,
transform_x=0.1,
speed=1.2,
target_start=0,
relative_index=0
)
video_result = add_video_impl(
video_url="https://videos.pexels.com/video-files/3129769/3129769-uhd_3840_2160_30fps.mp4", # Replace with actual video URL
draft_id=video_result['output']['draft_id'],
start=0,
end=5,
width=1920,
height=1080,
track_name="main_video_3",
transform_y=0.1,
scale_x=0.8,
scale_y=0.8,
transform_x=0.1,
speed=1.2,
target_start=0,
relative_index=0
)
video_result = add_video_impl(
video_url="https://videos.pexels.com/video-files/3129769/3129769-sd_426_240_30fps.mp4", # Replace with actual video URL
draft_id=video_result['output']['draft_id'],
start=0,
end=5,
width=1920,
height=1080,
track_name="main_video_4",
transform_y=0.1,
scale_x=0.8,
scale_y=0.8,
transform_x=0.1,
speed=1.2,
target_start=0,
relative_index=0
)
video_result = add_video_impl(
video_url="https://videos.pexels.com/video-files/3129769/3129769-sd_640_360_30fps.mp4", # Replace with actual video URL
draft_id=video_result['output']['draft_id'],
start=0,
end=5,
width=1920,
height=1080,
track_name="main_video_5",
transform_y=0.1,
scale_x=0.8,
scale_y=0.8,
transform_x=0.1,
speed=1.2,
target_start=0,
relative_index=0
)
video_result = add_video_impl(
video_url="https://videos.pexels.com/video-files/3129769/3129769-uhd_2560_1440_30fps.mp4", # Replace with actual video URL
draft_id=video_result['output']['draft_id'],
start=0,
end=5,
width=1920,
height=1080,
track_name="main_video_6",
transform_y=0.1,
scale_x=0.8,
scale_y=0.8,
transform_x=0.1,
speed=1.2,
target_start=0,
relative_index=0
)
if video_result.get('success') and video_result.get('output'):
print(json.loads(query_script_impl(video_result['output']['draft_id'])['output']))
# query_draft_status_impl_polling(video_result['output']['draft_id'])
# save_draft_impl(video_result['output']['draft_id'], draft_folder)
def test_stiker_01():
"""Test adding stickers"""
# Add stickers, test various parameters, only for jianyingpro
draft_folder = JIANYINGPRO_DRAFT_FOLDER
result = add_sticker_impl(
resource_id="7107529669750066445",
start=1.0,
end=4.0,
transform_y=0.3, # Move up
transform_x=-0.2, # Move left
alpha=0.8, # Set transparency
rotation=45.0, # Rotate 45 degrees
scale_x=1.5, # Horizontal scale 1.5x
scale_y=1.5, # Vertical scale 1.5x
flip_horizontal=True # Horizontal flip
)
print(f"Sticker adding result: {save_draft_impl(result['output']['draft_id'], draft_folder)}")
def test_stiker_02():
"""Test adding stickers"""
# Add stickers, test various parameters, only for jianyingpro
draft_folder = JIANYINGPRO_DRAFT_FOLDER
result = add_sticker_impl(
resource_id="7107529669750066445",
start=1.0,
end=4.0,
transform_y=0.3, # Move up
transform_x=-0.2, # Move left
alpha=0.8, # Set transparency
rotation=45.0, # Rotate 45 degrees
scale_x=1.5, # Horizontal scale 1.5x
scale_y=1.5, # Vertical scale 1.5x
flip_horizontal=True # Horizontal flip
)
result = add_sticker_impl(
resource_id="7107529669750066445",
draft_id=result['output']['draft_id'],
start=5.0,
end=10.0,
transform_y=-0.3, # Move up
transform_x=0.5, # Move left
alpha=0.1, # Set transparency
rotation=30.0, # Rotate 30 degrees
scale_x=1.5, # Horizontal scale 1.5x
scale_y=1.2, # Vertical scale 1.2x
)
print(f"Sticker adding result: {save_draft_impl(result['output']['draft_id'], draft_folder)}")
def test_stiker_03():
"""Test adding stickers"""
# Add stickers, test various parameters, only for jianyingpro
draft_folder = JIANYINGPRO_DRAFT_FOLDER
result = add_sticker_impl(
resource_id="7107529669750066445",
start=1.0,
end=4.0,
transform_y=0.3, # Move up
transform_x=-0.2, # Move left
alpha=0.8, # Set transparency
rotation=45.0, # Rotate 45 degrees
scale_x=1.5, # Horizontal scale 1.5x
scale_y=1.5, # Vertical scale 1.5x
flip_horizontal=True, # Horizontal flip
track_name="stiker_main",
relative_index=999
)
result = add_sticker_impl(
resource_id="7107529669750066445",
draft_id=result['output']['draft_id'],
start=5.0,
end=10.0,
transform_y=-0.3, # Move up
transform_x=0.5, # Move left
alpha=0.1, # Set transparency
rotation=30.0, # Rotate 30 degrees
scale_x=1.5, # Horizontal scale 1.5x
scale_y=1.2, # Vertical scale 1.2x
track_name="stiker_main_2",
relative_index=0
)
print(f"Sticker adding result: {save_draft_impl(result['output']['draft_id'], draft_folder)}")
def test_transition_01():
"""Test adding multiple images with dissolve transition effects"""
# Set draft folder path for saving
draft_folder = CAPCUT_DRAFT_FOLDER
print("\nTest: Adding image 1")
image_result = add_image_impl(
image_url="https://cdn.wanx.aliyuncs.com/wanx/1719234057367822001/text_to_image_v2/d6e33c84d7554146a25b1093b012838b_0.png?x-oss-process=image/resize,w_500/watermark,image_aW1nL3dhdGVyMjAyNDExMjkwLnBuZz94LW9zcy1wcm9jZXNzPWltYWdlL3Jlc2l6ZSxtX2ZpeGVkLHdfMTQ1LGhfMjU=,t_80,g_se,x_10,y_10/format,webp",
width=480,
height=480,
start=0,
end=5.0,
transform_y=0.7,
scale_x=2.0,
scale_y=1.0,
transform_x=0,
track_name="main",
transition="Dissolve",
transition_duration=1.0
)
print(f"Image 1 added successfully! {image_result['output']['draft_id']}")
print("\nTest: Adding image 2")
image_result = add_image_impl(
draft_id=image_result['output']['draft_id'],
image_url="https://cdn.wanx.aliyuncs.com/wanx/1719234057367822001/text_to_image_v2/d6e33c84d7554146a25b1093b012838b_0.png?x-oss-process=image/resize,w_500/watermark,image_aW1nL3dhdGVyMjAyNDExMjkwLnBuZz94LW9zcy1wcm9jZXNzPWltYWdlL3Jlc2l6ZSxtX2ZpeGVkLHdfMTQ1LGhfMjU=,t_80,g_se,x_10,y_10/format,webp",
width=480,
height=480,
start=5,
end=10.0,
transform_y=0.7,
scale_x=2.0,
scale_y=1.0,
transform_x=0,
track_name="main"
)
print(f"Image 2 added successfully! {image_result['output']['draft_id']}")
print(save_draft_impl(image_result['output']['draft_id'], draft_folder))
def test_transition_02():
"""Test adding video tracks with transition effects"""
# Set draft folder path for saving
draft_folder = CAPCUT_DRAFT_FOLDER
# Define video URL for testing
video_url = "https://cdn.wanx.aliyuncs.com/wanx/1719234057367822001/text_to_video/092faf3c94244973ab752ee1280ba76f.mp4?spm=5176.29623064.0.0.41ed26d6cBOhV3&file=092faf3c94244973ab752ee1280ba76f.mp4"
print("\nTest: Adding video track")
video_result = add_video_impl(
video_url=video_url,
width=1920,
height=1080,
start=0,
end=5.0, # Trim first 5 seconds of video
target_start=0,
track_name="main_video_track",
transition="Dissolve",
transition_duration=1.0
)
print(f"Video track adding result: {video_result}")
print("\nTest: Adding video track")
video_result = add_video_impl(
video_url=video_url,
draft_id=video_result['output']['draft_id'],
width=1920,
height=1080,
start=0,
end=5.0, # Trim first 5 seconds of video
target_start=5.0,
track_name="main_video_track"
)
print(f"Video track adding result: {video_result}")
if video_result and 'output' in video_result and 'draft_id' in video_result['output']:
draft_id = video_result['output']['draft_id']
print(f"Saving draft: {save_draft_impl(draft_id, draft_folder)}")
else:
print("Unable to get draft ID, skipping save operation.")
if __name__ == "__main__":
# test01()
# test02()
# test_effect_01() # Run effect test
# test_effect_02()
# test_audio01()
# test_audio02()
# test_audio03()
# test_audio04()
# test_image01()
# test_image02()
# test_image03()
# test_image04()
# # test_video()
# test_video_02()
# test_text()
# test_video_track01()
# test_video_track02()
# test_video_track03()
# test_video_track04()
# test_keyframe()
# test_keyframe_02()
test_subtitle_01()
# test_subtitle_02()
# test_subtitle()
# test_stiker_01()
# test_stiker_02()
# test_stiker_03()
# test_transition_01()
# test_transition_02()
# # test_generate_image01()
# # test_generate_image02()
# # test_speech_01()
# test_mask_01()
# test_mask_02()