ffmpeg / renderer /studio /capabilities.py
Ava2lon's picture
Upload 38 files
fe7106b verified
Raw
History Blame Contribute Delete
9.07 kB
from __future__ import annotations
from copy import deepcopy
from typing import Any
TIMELINE_TRACK_TYPES = [
"video",
"audio",
"text",
"overlay",
"sticker",
"subtitle",
]
TIMELINE_OPERATIONS = [
"drag",
"split",
"trim",
"ripple_delete",
"insert",
"replace",
"group",
"lock",
"hide",
"duplicate",
]
VIDEO_EDITING_OPERATIONS = [
"cut",
"split",
"trim",
"merge",
"concat",
"reverse",
"freeze_frame",
"speed",
"speed_ramp",
"time_remap",
"slow_motion",
"fast_motion",
"reverse_playback",
"crop",
"rotate",
"flip",
"resize",
"scale",
"zoom",
"pan",
"motion_blur",
"stabilization",
"lens_correction",
"compress",
"normalize",
"loop",
"gif",
"frames",
"watermark",
"overlay_text",
"burn_subtitles",
"convert",
]
AI_EDITING_FEATURES = [
"auto_edit",
"auto_highlight_detection",
"auto_scene_detection",
"auto_reframe",
"auto_crop",
"auto_remove_silence",
"auto_beat_sync",
"auto_color_match",
"auto_motion_tracking",
"auto_subtitle_generation",
"auto_hook_detection",
"auto_thumbnail_selection",
"auto_music_selection",
"auto_b_roll_placement",
"auto_caption_animation",
"auto_viral_score",
"auto_platform_optimization",
]
KEYFRAME_PROPERTIES = [
"position",
"scale",
"rotation",
"opacity",
"blur",
"brightness",
"contrast",
"saturation",
"hue",
"volume",
"playback_speed",
"mask",
"shadow",
"glow",
"text_animation",
]
TRANSITION_FAMILIES = [
"basic",
"fade",
"dissolve",
"slide",
"push",
"zoom",
"spin",
"blur",
"whip",
"flash",
"glitch",
"light_leak",
"film_burn",
"camera_shake",
"3d_flip",
"cube",
"ripple",
"ink",
"morph",
"stretch",
"liquid",
"elastic",
"motion_blur",
]
VIDEO_EFFECTS = [
"glitch",
"rgb_split",
"shake",
"crt",
"vhs",
"noise",
"film_grain",
"bloom",
"glow",
"chromatic_aberration",
"lens_flare",
"dream",
"neon",
"cyberpunk",
"rain",
"snow",
"fog",
"lightning",
"fire",
"smoke",
"particle_system",
"spark",
"magic",
"comic",
"cartoon",
"anime",
"sketch",
"oil_painting",
"pixel_art",
"sharp_pop",
"clean_beauty",
"warm_glow",
"cinematic",
"dreamy",
"flash_pop",
"motion_blur",
"noir",
]
FILTER_FORMATS = [".cube", ".3dl", ".csp"]
FILTER_PRESETS = [
"cinema",
"vintage",
"warm",
"cold",
"black_and_white",
"hdr",
"instagram",
"tiktok",
"moody",
"travel",
"nature",
"food",
"portrait",
"luxury",
"night",
]
TEXT_FEATURES = [
"rich_text",
"curved_text",
"vertical_text",
"gradient_text",
"outline",
"shadow",
"glow",
"stroke",
"letter_spacing",
"word_spacing",
"animation_presets",
"typing_animation",
"bounce",
"wave",
"zoom",
"pop",
"fade",
"roll",
"tracking",
]
CAPTION_FEATURES = [
"whisper_transcription",
"word_timestamps",
"sentence_timestamps",
"emoji_insertion",
"speaker_detection",
"karaoke_captions",
"tiktok_captions",
"capcut_captions",
"animated_captions",
"subtitle_templates",
]
STICKER_PACKS = [
"png",
"svg",
"gif",
"animated_stickers",
"emoji_packs",
"reaction_packs",
"social_media_packs",
"call_to_action_packs",
]
SHAPES = [
"rectangle",
"circle",
"triangle",
"arrow",
"line",
"polygon",
"speech_bubble",
"custom_svg",
]
MASK_TYPES = [
"rectangle",
"circle",
"linear",
"radial",
"freehand",
"bezier",
"ai_subject_mask",
"ai_sky_mask",
"ai_person_mask",
]
CHROMA_KEY_FEATURES = [
"green_screen",
"blue_screen",
"ai_background_removal",
"edge_feathering",
"spill_suppression",
"shadow_preservation",
]
AUDIO_TOOLS = [
"music",
"voiceover",
"noise_reduction",
"equalizer",
"compressor",
"limiter",
"pitch_shift",
"voice_changer",
"fade",
"ducking",
"normalization",
"ai_enhancement",
"beat_detection",
"beat_markers",
]
MUSIC_PROVIDERS = ["musicgen", "suno_api", "stable_audio"]
MUSIC_STYLES = ["background_music", "lo_fi", "cinematic", "nasheed", "hip_hop", "corporate", "podcast", "meditation"]
VOICE_PROVIDERS = ["kokoro", "xtts", "piper", "openvoice"]
VOICE_FEATURES = ["voice_cloning", "multi_speaker", "emotion", "speed", "pitch", "style_transfer"]
IMAGE_GENERATION_PROVIDERS = ["flux", "sdxl", "controlnet"]
IMAGE_GENERATION_FEATURES = ["image_editing", "background_replacement", "object_removal", "upscaling"]
VIDEO_GENERATION_PROVIDERS = ["wan", "ltx_video", "hunyuan_video", "veo_api"]
VIDEO_GENERATION_FEATURES = ["animate_images", "image_to_video", "text_to_video"]
AI_ASSISTANTS = [
"script_writer",
"hook_generator",
"title_generator",
"description_generator",
"hashtag_generator",
"seo_optimizer",
"thumbnail_prompt_generator",
"b_roll_planner",
"storyboard_generator",
]
TEMPLATE_CATEGORIES = [
"youtube_shorts",
"tiktok",
"instagram_reels",
"facebook_reels",
"motivational",
"podcasts",
"gaming",
"news",
"luxury",
"business",
"education",
"finance",
"relationship",
"wedding",
"birthday",
"travel",
"cooking",
"fitness",
"anime",
"sports",
"product_ads",
"real_estate",
"e_commerce",
"faceless_channels",
"quote_videos",
"audiograms",
"story_videos",
"before_and_after",
"reaction_videos",
"countdown_videos",
]
EXPORT_FORMATS = ["mp4", "mov", "avi", "mkv", "gif", "webm", "png_sequence", "jpeg_sequence", "audio_only"]
EXPORT_PRESETS = [
"1080p",
"2k",
"4k",
"8k",
"tiktok",
"youtube",
"instagram",
"facebook",
"twitter",
"linkedin",
]
API_ENDPOINTS = {
"upload": "POST /upload",
"project_create": "POST /project/create",
"project_save": "POST /project/save",
"timeline_add": "POST /timeline/add",
"timeline_operation": "POST /timeline/operation",
"effect_apply": "POST /effect/apply",
"filter_apply": "POST /filter/apply",
"transition_add": "POST /transition/add",
"caption_generate": "POST /caption/generate",
"music_generate": "POST /music/generate",
"voice_generate": "POST /voice/generate",
"image_generate": "POST /image/generate",
"video_generate": "POST /video/generate",
"thumbnail_create": "POST /thumbnail/create",
"render": "POST /render",
"status": "GET /status/{job_id}",
"download": "GET /download/{job_id}",
"publish": "POST /publish",
}
def capability_catalog() -> dict[str, Any]:
return deepcopy(
{
"product": "Ava2lon Studio AI",
"principles": {
"cpu_first": True,
"optional_gpu": True,
"api_parity": True,
"async_long_running_tasks": True,
"status_polling": True,
"webhooks": True,
"plugin_support": True,
"template_driven": True,
"non_destructive_projects": True,
"multi_platform_export": True,
},
"timeline": {
"track_types": TIMELINE_TRACK_TYPES,
"operations": TIMELINE_OPERATIONS,
"unlimited_tracks": True,
},
"editing": VIDEO_EDITING_OPERATIONS,
"ai_editing": AI_EDITING_FEATURES,
"keyframes": KEYFRAME_PROPERTIES,
"transitions": TRANSITION_FAMILIES,
"effects": VIDEO_EFFECTS,
"filters": {"formats": FILTER_FORMATS, "presets": FILTER_PRESETS},
"text": TEXT_FEATURES,
"captions": CAPTION_FEATURES,
"stickers": STICKER_PACKS,
"shapes": SHAPES,
"masks": MASK_TYPES,
"chroma_key": CHROMA_KEY_FEATURES,
"audio": AUDIO_TOOLS,
"music_generator": {"providers": MUSIC_PROVIDERS, "styles": MUSIC_STYLES},
"voice_generator": {"providers": VOICE_PROVIDERS, "features": VOICE_FEATURES},
"image_generation": {"providers": IMAGE_GENERATION_PROVIDERS, "features": IMAGE_GENERATION_FEATURES},
"video_generation": {"providers": VIDEO_GENERATION_PROVIDERS, "features": VIDEO_GENERATION_FEATURES},
"assistants": AI_ASSISTANTS,
"templates": TEMPLATE_CATEGORIES,
"exports": {"formats": EXPORT_FORMATS, "presets": EXPORT_PRESETS},
"api_endpoints": API_ENDPOINTS,
}
)
def is_timeline_operation(operation: str) -> bool:
return operation in TIMELINE_OPERATIONS
def is_track_type(track_type: str) -> bool:
return track_type in TIMELINE_TRACK_TYPES