Files
CapCutAPI/add_effect_impl.py
2025-08-05 12:22:12 +08:00

91 lines
3.5 KiB
Python

from pyJianYingDraft import trange, Video_scene_effect_type, Video_character_effect_type, CapCut_Video_scene_effect_type, CapCut_Video_character_effect_type, exceptions
import pyJianYingDraft as draft
from typing import Optional, Dict, List, Union, Literal
from create_draft import get_or_create_draft
from util import generate_draft_url
from settings import IS_CAPCUT_ENV
def add_effect_impl(
effect_type: str, # Changed to string type
effect_category: Literal["scene", "character"],
start: float = 0,
end: float = 3.0,
draft_id: Optional[str] = None,
track_name: Optional[str] = "effect_01",
params: Optional[List[Optional[float]]] = None,
width: int = 1080,
height: int = 1920
) -> Dict[str, str]:
"""
Add an effect to the specified draft
:param effect_type: Effect type name, will be matched from Video_scene_effect_type or Video_character_effect_type
:param effect_category: Effect category, "scene" or "character", default "scene"
:param start: Start time (seconds), default 0
:param end: End time (seconds), default 3 seconds
:param draft_id: Draft ID, if None or corresponding zip file not found, a new draft will be created
:param track_name: Track name, can be omitted when there is only one effect track
:param params: Effect parameter list, items not provided or None in the parameter list will use default values
:param width: Video width, default 1080
:param height: Video height, default 1920
:return: Updated draft information
"""
# Get or create draft
draft_id, script = get_or_create_draft(
draft_id=draft_id,
width=width,
height=height
)
# Calculate time range
duration = end - start
t_range = trange(f"{start}s", f"{duration}s")
# Select the corresponding effect type based on effect category and environment
effect_enum = None
if IS_CAPCUT_ENV:
# If in CapCut environment, use CapCut effects
if effect_category == "scene":
try:
effect_enum = CapCut_Video_scene_effect_type[effect_type]
except:
effect_enum = None
elif effect_category == "character":
try:
effect_enum = CapCut_Video_character_effect_type[effect_type]
except:
effect_enum = None
else:
# Default to using JianYing effects
if effect_category == "scene":
try:
effect_enum = Video_scene_effect_type[effect_type]
except:
effect_enum = None
elif effect_category == "character":
try:
effect_enum = Video_character_effect_type[effect_type]
except:
effect_enum = None
if effect_enum is None:
raise ValueError(f"Unknown {effect_category} effect type: {effect_type}")
# Add effect track (only when track doesn't exist)
if track_name is not None:
try:
imported_track=script.get_imported_track(draft.Track_type.effect, name=track_name)
# If no exception is thrown, the track already exists
except exceptions.TrackNotFound:
# Track doesn't exist, create a new track
script.add_track(draft.Track_type.effect, track_name=track_name)
else:
script.add_track(draft.Track_type.effect)
# Add effect
script.add_effect(effect_enum, t_range, params=params[::-1], track_name=track_name)
return {
"draft_id": draft_id,
"draft_url": generate_draft_url(draft_id)
}