Files
CapCutAPI/example.py
sun-guannan 280d17e208 add example
2025-07-13 15:54:21 +08:00

2019 lines
77 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 util import timing_decorator
import functools
import threading
# Base URL of the service, please modify according to actual situation
BASE_URL = "http://localhost:9000"
LICENSE_KEY = "539C3FEB-74AE48D4-A964D52B-C520F801" # Using trial version license key
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 = {
"license_key": LICENSE_KEY, # Using trial version license key
"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.5, transform_y=0.5, 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,
bubble_effect_id=None, bubble_resource_id=None,
effect_effect_id=None, outro_animation=None):
"""API call to add text"""
data = {
"license_key": LICENSE_KEY, # Using trial version license key
"draft_folder": draft_folder,
"text": text,
"start": start,
"end": end,
"font": font,
"color": font_color,
"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
# 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
if draft_id:
data["draft_id"] = draft_id
if outro_animation:
data["outro_animation"] = outro_animation
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,
# New mask-related parameters
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):
"""API call to add image"""
data = {
"license_key": LICENSE_KEY, # Using trial version license key
"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
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 = {
"license_key": LICENSE_KEY, # Using trial version license key
"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 = {
"license_key": LICENSE_KEY, # Using trial version license key
"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 = {
"license_key": LICENSE_KEY, # Using trial version license key
"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):
"""API call to add video track"""
data = {
"license_key": LICENSE_KEY, # Using trial version license key
"video_url": video_url,
"height": height,
"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
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):
"""API call to add effect"""
data = {
"license_key": LICENSE_KEY, # Using trial version license key
"effect_type": effect_type,
"start": start,
"end": end,
"track_name": track_name,
"params": params or [],
"width": width,
"height": height
}
if draft_id:
data["draft_id"] = draft_id
return make_request("add_effect", data)
def test_effect_01():
"""Test adding effect service"""
# 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 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_text():
"""Test adding text"""
draft_folder = "/Users/sunguannan/Movies/JianyingPro/User Data/Projects/com.lveditor.draft"
# 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", # Black 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)
# Finally save and upload the draft
if result3.get('success') and result3.get('output'):
save_result = save_draft_impl(result3['output']['draft_id'],draft_folder)
print(f"Draft save result: {save_result}")
# Return the last test result for subsequent operations (if any)
return result3
def test_image01():
"""Test adding image"""
# 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 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 = "/Users/sunguannan/Movies/JianyingPro/User Data/Projects/com.lveditor.draft"
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 = "/Users/sunguannan/Movies/JianyingPro/User Data/Projects/com.lveditor.draft"
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 = "/Users/sunguannan/Movies/JianyingPro/User Data/Projects/com.lveditor.draft"
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_mask_01():
"""Test adding images to different tracks"""
draft_folder = "/Users/sunguannan/Movies/JianyingPro/User Data/Projects/com.lveditor.draft"
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"""
draft_folder = "/Users/sunguannan/Movies/JianyingPro/User Data/Projects/com.lveditor.draft"
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 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 = "/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 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 = "/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 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 = "/Users/sunguannan/Movies/JianyingPro/User Data/Projects/com.lveditor.draft"
draft_folder = "/Users/sunguannan/Movies/CapCut/User Data/Projects/com.lveditor.draft"
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 = "/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 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,
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_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 = "/Users/sunguannan/Movies/JianyingPro/User Data/Projects/com.lveditor.draft"
# 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 = "/Users/sunguannan/Movies/JianyingPro/User Data/Projects/com.lveditor.draft"
# draft_folder = "/Users/sunguannan/Movies/CapCut/User Data/Projects/com.lveditor.draft"
# 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 = "/Users/sunguannan/Movies/JianyingPro/User Data/Projects/com.lveditor.draft"
draft_folder = "/Users/sunguannan/Movies/CapCut/User Data/Projects/com.lveditor.draft"
# 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 = "/Users/sunguannan/Movies/JianyingPro/User Data/Projects/com.lveditor.draft"
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 = "/Users/sunguannan/Movies/JianyingPro/User Data/Projects/com.lveditor.draft"
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 = "/Users/sunguannan/Movies/JianyingPro/User Data/Projects/com.lveditor.draft"
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 = "/Users/sunguannan/Movies/JianyingPro/User Data/Projects/com.lveditor.draft"
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_keyframe():
"""Test adding keyframes"""
draft_folder = "/Users/sunguannan/Movies/JianyingPro/User Data/Projects/com.lveditor.draft"
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 = "/Users/sunguannan/Movies/JianyingPro/User Data/Projects/com.lveditor.draft"
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 = "/Users/sunguannan/Movies/JianyingPro/User Data/Projects/com.lveditor.draft"
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 = "/Users/sunguannan/Movies/JianyingPro/User Data/Projects/com.lveditor.draft"
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():
draft_folder = "/Users/sunguannan/Movies/JianyingPro/User Data/Projects/com.lveditor.draft"
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():
draft_folder = "/Users/sunguannan/Movies/JianyingPro/User Data/Projects/com.lveditor.draft"
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", # 替换为实际的视频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", # 替换为实际的视频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", # 替换为实际的视频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", # 替换为实际的视频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
draft_folder = "/Users/sunguannan/Movies/JianyingPro/User Data/Projects/com.lveditor.draft"
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
draft_folder = "/Users/sunguannan/Movies/JianyingPro/User Data/Projects/com.lveditor.draft"
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
draft_folder = "/Users/sunguannan/Movies/JianyingPro/User Data/Projects/com.lveditor.draft"
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"""
draft_folder = "/Users/sunguannan/Movies/JianyingPro/User Data/Projects/com.lveditor.draft"
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"""
draft_folder = "/Users/sunguannan/Movies/JianyingPro/User Data/Projects/com.lveditor.draft"
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: 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.")
def test_generate_image01():
"""Test adding image"""
draft_folder = "/Users/sunguannan/Movies/JianyingPro/User Data/Projects/com.lveditor.draft"
print("\nTest: Adding image 1")
image_result = generate_image_impl(
prompt="An Asian style doodle person floating in rough sea waves labeled 'Job Market', throwing paper boats made of resumes that are sinking, with a bank account notification bubble showing low balance. Atmosphere: Lost, anxious, turbulent. Art style: Minimalist line art, black and white cartoon style, bold outlines, extremely thick lines, expressive emotions, simple doodle, monochromatic. Composition: Wide angle showing person in center of chaotic elements. Lighting: Harsh contrast.",
width=1024,
height=1024,
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 generated successfully! {image_result['output']['draft_id']}")
print(save_draft_impl(image_result['output']['draft_id'], draft_folder))
def generate_speech_impl(texts, draft_id=None, audio_track_name=None, language="Chinese",
speaker_id="爽快思思/Skye",azure_speaker_id=None, speed_ratio=1.0, start_offset=0.0,
end_padding=0.0, interval_time=0.5, volume=1.0, width=1080, height=1920,
add_subtitle=True, text_track_name=None, font="文轩体",
font_color="#ffffff", font_size=8.0, transform_y=-0.8, transform_x=0,
vertical=False, font_alpha=1.0, border_alpha=1.0, border_color="#000000",
border_width=0.0, background_color="#000000", background_style=1,
background_alpha=0.0, 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):
"""Generate TTS speech and add to draft API call"""
data = {
"license_key": LICENSE_KEY, # Using trial version license key
"texts": texts,
"audio_track_name": audio_track_name,
"language": language,
"speaker_id": speaker_id,
"azure_speaker_id": azure_speaker_id,
"speed_ratio": speed_ratio,
"start_offset": start_offset,
"end_padding": end_padding,
"interval_time": interval_time,
"volume": volume,
"width": width,
"height": height,
"add_subtitle": add_subtitle,
"text_track_name": text_track_name,
"font": font,
"font_color": font_color,
"font_size": font_size,
"transform_y": transform_y,
"transform_x": transform_x,
"vertical": vertical,
"font_alpha": font_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,
"bubble_effect_id": bubble_effect_id,
"bubble_resource_id": bubble_resource_id,
"effect_effect_id": effect_effect_id,
"intro_animation": intro_animation,
"intro_duration": intro_duration,
"outro_animation": outro_animation,
"outro_duration": outro_duration
}
if draft_id:
data["draft_id"] = draft_id
return make_request("generate_speech", data)
def test_generate_image02():
"""Test adding image"""
draft_folder = "/Users/sunguannan/Movies/JianyingPro/User Data/Projects/com.lveditor.draft"
print("\nTest: Adding image 1")
image_result = generate_image_impl(
prompt="A cat in the garden",
width=1024,
height=1024,
start=0,
end=5.0,
transform_y=0.7,
scale_x=2.0,
scale_y=1.0,
transform_x=0,
track_name="main"
)
print("\nTest: Adding image 2")
image_result = generate_image_impl(
prompt="3 dogs running in the snow",
draft_id=image_result['output']['draft_id'],
width=576,
height=1024,
start=5.0,
end=10.0,
transform_y=-0.7,
scale_x=2.0,
scale_y=2.0,
transform_x=0,
track_name="main"
)
print(f"Image generated successfully! {image_result['output']['draft_id']}")
print(save_draft_impl(image_result['output']['draft_id'], draft_folder))
@timing_decorator('TTS Speech Generation')
def test_speech_01():
"""Test TTS speech generation and subtitle addition"""
draft_folder = "/Users/sunguannan/Movies/JianyingPro/User Data/Projects/com.lveditor.draft"
print("\nTest: Generate TTS speech and add subtitles")
speech_result = generate_speech_impl(
texts=["Hello everyone, welcome to my video", "Today we will discuss an interesting topic","What to do when your child doesn't want to go to school", "Hope you enjoy this content","Hello everyone, welcome to my video", "Today we will discuss an interesting topic","What to do when your child doesn't want to go to school", "Hope you enjoy this content","Hello everyone, welcome to my video", "Today we will discuss an interesting topic","What to do when your child doesn't want to go to school", "Hope you enjoy this content"],
language="Chinese",
draft_id="123",
speaker_id="渊博小叔",
azure_speaker_id="zh-CN-YunjianNeural",
speed_ratio=1.0,
start_offset=1.0,
end_padding=1.0,
interval_time=0.5,
volume=0.8,
width=1080,
height=1920,
add_subtitle=True,
font="文轩体",
font_color="#ffffff",
font_size=8.0,
transform_y=-0.8,
transform_x=0,
border_width=2.0,
border_color="#000000",
border_alpha=0.8
)
print(f"TTS speech generation result: {speech_result}")
# if speech_result.get('success'):
# # Save draft
# save_result = save_draft_impl(speech_result['output']['draft_id'], draft_folder)
# print(f"Draft saving result: {save_result}")
# else:
# print(f"TTS generation failed: {speech_result.get('error')}")
if __name__ == "__main__":
# test01()
# test02()
# test_effect_01() # Run effect test
# 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()