@imgly/codesign-mcp 0.1.5 → 0.1.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +51 -1
- package/assets/docs/guide/SKILL.md +45 -53
- package/assets/docs/guide/animation/create/base.md +234 -243
- package/assets/docs/guide/animation/create/text.md +250 -231
- package/assets/docs/guide/animation/create.md +197 -231
- package/assets/docs/guide/animation/edit.md +196 -271
- package/assets/docs/guide/animation/types.md +182 -185
- package/assets/docs/guide/animation.md +9 -6
- package/assets/docs/guide/api/AssetAPI.md +7 -53
- package/assets/docs/guide/api/BlockAPI.md +725 -648
- package/assets/docs/guide/api/CreativeEngine.md +7 -16
- package/assets/docs/guide/api/EditorAPI.md +32 -93
- package/assets/docs/guide/api/EventAPI.md +1 -2
- package/assets/docs/guide/api/SceneAPI.md +47 -98
- package/assets/docs/guide/api/VariableAPI.md +1 -4
- package/assets/docs/guide/api/node/classes/assetapi.md +1090 -0
- package/assets/docs/guide/api/node/classes/blockapi.md +12965 -0
- package/assets/docs/guide/api/node/classes/creativeengine.md +319 -0
- package/assets/docs/guide/api/node/classes/editorapi.md +3417 -0
- package/assets/docs/guide/api/node/classes/engineactions.md +319 -0
- package/assets/docs/guide/api/node/classes/eventapi.md +56 -0
- package/assets/docs/guide/api/node/classes/sceneapi.md +1370 -0
- package/assets/docs/guide/api/node/classes/variableapi.md +143 -0
- package/assets/docs/guide/api/node/enumerations/compressionformat.md +23 -0
- package/assets/docs/guide/api/node/enumerations/compressionlevel.md +24 -0
- package/assets/docs/guide/api/node/functions/iscmykcolor.md +30 -0
- package/assets/docs/guide/api/node/functions/isrgbacolor.md +30 -0
- package/assets/docs/guide/api/node/functions/isspotcolor.md +30 -0
- package/assets/docs/guide/api/node/interfaces/addvideooptions.md +31 -0
- package/assets/docs/guide/api/node/interfaces/applyassetoptions.md +31 -0
- package/assets/docs/guide/api/node/interfaces/asset.md +30 -0
- package/assets/docs/guide/api/node/interfaces/assetbooleanproperty.md +25 -0
- package/assets/docs/guide/api/node/interfaces/assetcmykcolor.md +26 -0
- package/assets/docs/guide/api/node/interfaces/assetcolorproperty.md +25 -0
- package/assets/docs/guide/api/node/interfaces/assetcontentaspectratio.md +23 -0
- package/assets/docs/guide/api/node/interfaces/assetdefinition.md +31 -0
- package/assets/docs/guide/api/node/interfaces/assetenumproperty.md +26 -0
- package/assets/docs/guide/api/node/interfaces/assetfixedaspectratio.md +24 -0
- package/assets/docs/guide/api/node/interfaces/assetfixedsize.md +25 -0
- package/assets/docs/guide/api/node/interfaces/assetfreeaspectratio.md +22 -0
- package/assets/docs/guide/api/node/interfaces/assetnumberproperty.md +28 -0
- package/assets/docs/guide/api/node/interfaces/assetpayload.md +27 -0
- package/assets/docs/guide/api/node/interfaces/assetquerydata.md +32 -0
- package/assets/docs/guide/api/node/interfaces/assetresult.md +46 -0
- package/assets/docs/guide/api/node/interfaces/assetrgbcolor.md +25 -0
- package/assets/docs/guide/api/node/interfaces/assetsource.md +111 -0
- package/assets/docs/guide/api/node/interfaces/assetspotcolor.md +25 -0
- package/assets/docs/guide/api/node/interfaces/assetsqueryresult.md +31 -0
- package/assets/docs/guide/api/node/interfaces/assetstringproperty.md +25 -0
- package/assets/docs/guide/api/node/interfaces/assetstylepreset.md +39 -0
- package/assets/docs/guide/api/node/interfaces/assetstylepresetanimation.md +23 -0
- package/assets/docs/guide/api/node/interfaces/audiotrackinfo.md +32 -0
- package/assets/docs/guide/api/node/interfaces/blockevent.md +26 -0
- package/assets/docs/guide/api/node/interfaces/blockstateerror.md +26 -0
- package/assets/docs/guide/api/node/interfaces/blockstatepending.md +26 -0
- package/assets/docs/guide/api/node/interfaces/blockstateready.md +25 -0
- package/assets/docs/guide/api/node/interfaces/buffer.md +26 -0
- package/assets/docs/guide/api/node/interfaces/characterinkbox.md +29 -0
- package/assets/docs/guide/api/node/interfaces/cmykcolor.md +34 -0
- package/assets/docs/guide/api/node/interfaces/completeassetresult.md +46 -0
- package/assets/docs/guide/api/node/interfaces/configuration.md +38 -0
- package/assets/docs/guide/api/node/interfaces/dominantcolor.md +25 -0
- package/assets/docs/guide/api/node/interfaces/dominantcolorsoptions.md +23 -0
- package/assets/docs/guide/api/node/interfaces/engineactioninfo.md +24 -0
- package/assets/docs/guide/api/node/interfaces/engineactionsregistry.md +18 -0
- package/assets/docs/guide/api/node/interfaces/engineplugin.md +30 -0
- package/assets/docs/guide/api/node/interfaces/font.md +27 -0
- package/assets/docs/guide/api/node/interfaces/fontmetrics.md +32 -0
- package/assets/docs/guide/api/node/interfaces/gradientcolorstop.md +28 -0
- package/assets/docs/guide/api/node/interfaces/logger.md +39 -0
- package/assets/docs/guide/api/node/interfaces/pageduration.md +23 -0
- package/assets/docs/guide/api/node/interfaces/range.md +23 -0
- package/assets/docs/guide/api/node/interfaces/rgbacolor.md +32 -0
- package/assets/docs/guide/api/node/interfaces/rgbcolor.md +30 -0
- package/assets/docs/guide/api/node/interfaces/settings.md +126 -0
- package/assets/docs/guide/api/node/interfaces/size2.md +21 -0
- package/assets/docs/guide/api/node/interfaces/source.md +24 -0
- package/assets/docs/guide/api/node/interfaces/spotcolor.md +30 -0
- package/assets/docs/guide/api/node/interfaces/textdecorationconfig.md +31 -0
- package/assets/docs/guide/api/node/interfaces/textfontsizeoptions.md +24 -0
- package/assets/docs/guide/api/node/interfaces/textruninfo.md +33 -0
- package/assets/docs/guide/api/node/interfaces/transientresource.md +26 -0
- package/assets/docs/guide/api/node/interfaces/typeface.md +23 -0
- package/assets/docs/guide/api/node/interfaces/vec2.md +21 -0
- package/assets/docs/guide/api/node/interfaces/vec3.md +22 -0
- package/assets/docs/guide/api/node/type-aliases/addimageoptions.md +36 -0
- package/assets/docs/guide/api/node/type-aliases/animationbaselinedirection.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/animationblockswipetextdirection.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/animationeasing.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/animationentry.md +28 -0
- package/assets/docs/guide/api/node/type-aliases/animationgrowdirection.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/animationjumploopdirection.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/animationkenburnsdirection.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/animationmergetextdirection.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/animationoptions.md +28 -0
- package/assets/docs/guide/api/node/type-aliases/animationspindirection.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/animationspinloopdirection.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/animationtype.md +24 -0
- package/assets/docs/guide/api/node/type-aliases/animationtypelonghand.md +21 -0
- package/assets/docs/guide/api/node/type-aliases/animationtypeshorthand.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/animationtypewritertextwritingstyle.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/animationwipedirection.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/applicationmimetype.md +20 -0
- package/assets/docs/guide/api/node/type-aliases/assetcolor.md +23 -0
- package/assets/docs/guide/api/node/type-aliases/assetfilter.md +47 -0
- package/assets/docs/guide/api/node/type-aliases/assetgroups.md +25 -0
- package/assets/docs/guide/api/node/type-aliases/assetmetadata.md +42 -0
- package/assets/docs/guide/api/node/type-aliases/assetproperty.md +25 -0
- package/assets/docs/guide/api/node/type-aliases/assetpropertyfilter.md +41 -0
- package/assets/docs/guide/api/node/type-aliases/assetpropertypath.md +26 -0
- package/assets/docs/guide/api/node/type-aliases/assetstylepresetanimationproperties.md +34 -0
- package/assets/docs/guide/api/node/type-aliases/assetstylepresetproperties.md +29 -0
- package/assets/docs/guide/api/node/type-aliases/assetstylepresetpropertyvalue.md +29 -0
- package/assets/docs/guide/api/node/type-aliases/assetstylepresetscalableproperty.md +28 -0
- package/assets/docs/guide/api/node/type-aliases/assettransformpreset.md +24 -0
- package/assets/docs/guide/api/node/type-aliases/asyncuriresolver.md +36 -0
- package/assets/docs/guide/api/node/type-aliases/audioexportoptions.md +43 -0
- package/assets/docs/guide/api/node/type-aliases/audiofromvideooptions.md +27 -0
- package/assets/docs/guide/api/node/type-aliases/audiomimetype.md +20 -0
- package/assets/docs/guide/api/node/type-aliases/blendmode.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/blockenumtype.md +63 -0
- package/assets/docs/guide/api/node/type-aliases/blockstate.md +26 -0
- package/assets/docs/guide/api/node/type-aliases/blurtype.md +24 -0
- package/assets/docs/guide/api/node/type-aliases/blurtypelonghand.md +21 -0
- package/assets/docs/guide/api/node/type-aliases/blurtypeshorthand.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/booleanoperation.md +27 -0
- package/assets/docs/guide/api/node/type-aliases/boolpropertyname.md +79 -0
- package/assets/docs/guide/api/node/type-aliases/cameraclampingovershootmode.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/captionhorizontalalignment.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/captionverticalalignment.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/cmyk.md +23 -0
- package/assets/docs/guide/api/node/type-aliases/color.md +23 -0
- package/assets/docs/guide/api/node/type-aliases/colorpickercolormode.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/colorpropertyname.md +31 -0
- package/assets/docs/guide/api/node/type-aliases/colorspace.md +20 -0
- package/assets/docs/guide/api/node/type-aliases/contentfillmode.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/controlgizmomovehandlevisibility.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/controlgizmoresizehandlesvisibility.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/controlgizmorotatehandlesvisibility.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/controlgizmoscalehandlesvisibility.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/createsceneoptions.md +30 -0
- package/assets/docs/guide/api/node/type-aliases/cutoutoperation.md +20 -0
- package/assets/docs/guide/api/node/type-aliases/cutouttype.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/defaultassetsourceid.md +37 -0
- package/assets/docs/guide/api/node/type-aliases/demoassetsourceid.md +33 -0
- package/assets/docs/guide/api/node/type-aliases/designblockid.md +20 -0
- package/assets/docs/guide/api/node/type-aliases/designblocktype.md +24 -0
- package/assets/docs/guide/api/node/type-aliases/designblocktypelonghand.md +21 -0
- package/assets/docs/guide/api/node/type-aliases/designblocktypeshorthand.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/designunit.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/doubleclickselectionmode.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/doublepropertyname.md +26 -0
- package/assets/docs/guide/api/node/type-aliases/dropshadowoptions.md +32 -0
- package/assets/docs/guide/api/node/type-aliases/editmode.md +27 -0
- package/assets/docs/guide/api/node/type-aliases/effecttype.md +24 -0
- package/assets/docs/guide/api/node/type-aliases/effecttypelonghand.md +21 -0
- package/assets/docs/guide/api/node/type-aliases/effecttypeshorthand.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/engineactionid.md +20 -0
- package/assets/docs/guide/api/node/type-aliases/enginecustomactionfunction.md +30 -0
- package/assets/docs/guide/api/node/type-aliases/engineplugincontext.md +30 -0
- package/assets/docs/guide/api/node/type-aliases/enumpropertyname.md +59 -0
- package/assets/docs/guide/api/node/type-aliases/enumvalues.md +59 -0
- package/assets/docs/guide/api/node/type-aliases/exportoptions.md +57 -0
- package/assets/docs/guide/api/node/type-aliases/fillpixelstreamorientation.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/filltype.md +24 -0
- package/assets/docs/guide/api/node/type-aliases/filltypelonghand.md +21 -0
- package/assets/docs/guide/api/node/type-aliases/filltypeshorthand.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/floatpropertyname.md +184 -0
- package/assets/docs/guide/api/node/type-aliases/fontsizeunit.md +23 -0
- package/assets/docs/guide/api/node/type-aliases/fontstyle.md +20 -0
- package/assets/docs/guide/api/node/type-aliases/fontweight.md +30 -0
- package/assets/docs/guide/api/node/type-aliases/gradientstoprgba.md +23 -0
- package/assets/docs/guide/api/node/type-aliases/heightmode.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/hexcolorstring.md +20 -0
- package/assets/docs/guide/api/node/type-aliases/historyid.md +20 -0
- package/assets/docs/guide/api/node/type-aliases/historyupdate.md +25 -0
- package/assets/docs/guide/api/node/type-aliases/horizontalblockalignment.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/horizontalcontentfillalignment.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/horizontaltextalignment.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/imagemimetype.md +25 -0
- package/assets/docs/guide/api/node/type-aliases/intpropertyname.md +26 -0
- package/assets/docs/guide/api/node/type-aliases/liststyle.md +20 -0
- package/assets/docs/guide/api/node/type-aliases/locale.md +20 -0
- package/assets/docs/guide/api/node/type-aliases/loglevel.md +24 -0
- package/assets/docs/guide/api/node/type-aliases/mimetype.md +20 -0
- package/assets/docs/guide/api/node/type-aliases/objecttype.md +24 -0
- package/assets/docs/guide/api/node/type-aliases/objecttypelonghand.md +27 -0
- package/assets/docs/guide/api/node/type-aliases/objecttypeshorthand.md +27 -0
- package/assets/docs/guide/api/node/type-aliases/optionalprefix.md +24 -0
- package/assets/docs/guide/api/node/type-aliases/pageguidessource.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/palettecolor.md +24 -0
- package/assets/docs/guide/api/node/type-aliases/positionmode.md +20 -0
- package/assets/docs/guide/api/node/type-aliases/positionxmode.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/positionymode.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/propertytype.md +31 -0
- package/assets/docs/guide/api/node/type-aliases/rgba.md +23 -0
- package/assets/docs/guide/api/node/type-aliases/rolestring.md +23 -0
- package/assets/docs/guide/api/node/type-aliases/scenefontsizeunit.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/scenelayout.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/scenemode.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/scope.md +50 -0
- package/assets/docs/guide/api/node/type-aliases/settingboolpropertyname.md +62 -0
- package/assets/docs/guide/api/node/type-aliases/settingcolorpropertyname.md +38 -0
- package/assets/docs/guide/api/node/type-aliases/settingenumpropertyname.md +29 -0
- package/assets/docs/guide/api/node/type-aliases/settingenumtype.md +33 -0
- package/assets/docs/guide/api/node/type-aliases/settingenumvalues.md +29 -0
- package/assets/docs/guide/api/node/type-aliases/settingfloatpropertyname.md +25 -0
- package/assets/docs/guide/api/node/type-aliases/settingintpropertyname.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/settingkey.md +20 -0
- package/assets/docs/guide/api/node/type-aliases/settingsbool.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/settingscolor.md +20 -0
- package/assets/docs/guide/api/node/type-aliases/settingscolorrgba.md +24 -0
- package/assets/docs/guide/api/node/type-aliases/settingsenum.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/settingsfloat.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/settingsint.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/settingsstring.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/settingstringpropertyname.md +28 -0
- package/assets/docs/guide/api/node/type-aliases/settingtype.md +20 -0
- package/assets/docs/guide/api/node/type-aliases/settingvaluetype.md +26 -0
- package/assets/docs/guide/api/node/type-aliases/shapetype.md +24 -0
- package/assets/docs/guide/api/node/type-aliases/shapetypelonghand.md +21 -0
- package/assets/docs/guide/api/node/type-aliases/shapetypeshorthand.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/shapevectorpathfillrule.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/sizemode.md +20 -0
- package/assets/docs/guide/api/node/type-aliases/sortingorder.md +21 -0
- package/assets/docs/guide/api/node/type-aliases/sourcesetpropertyname.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/splitoptions.md +28 -0
- package/assets/docs/guide/api/node/type-aliases/stringpropertyname.md +43 -0
- package/assets/docs/guide/api/node/type-aliases/strokecap.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/strokecornergeometry.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/strokedashendcap.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/strokedashstartcap.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/strokeendcap.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/strokeposition.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/strokestartcap.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/strokestyle.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/syncuriresolver.md +31 -0
- package/assets/docs/guide/api/node/type-aliases/textanimationwritingstyle.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/textcase.md +20 -0
- package/assets/docs/guide/api/node/type-aliases/textdecorationline.md +27 -0
- package/assets/docs/guide/api/node/type-aliases/textdecorationstyle.md +26 -0
- package/assets/docs/guide/api/node/type-aliases/textverticalalignment.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/timelinetrackvisibility.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/touchpinchaction.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/touchrotateaction.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/typefacedefinition.md +41 -0
- package/assets/docs/guide/api/node/type-aliases/verticalblockalignment.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/verticalcontentfillalignment.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/videoexportoptions.md +54 -0
- package/assets/docs/guide/api/node/type-aliases/videomimetype.md +20 -0
- package/assets/docs/guide/api/node/type-aliases/widthmode.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/xywh.md +23 -0
- package/assets/docs/guide/api/node/type-aliases/zoomautofitaxis.md +20 -0
- package/assets/docs/guide/api/node/type-aliases/zoomoptions.md +27 -0
- package/assets/docs/guide/api/node/variables/animation_types.md +21 -0
- package/assets/docs/guide/api/node/variables/animationbaselinedirectionvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/animationblockswipetextdirectionvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/animationeasingvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/animationgrowdirectionvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/animationjumploopdirectionvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/animationkenburnsdirectionvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/animationmergetextdirectionvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/animationspindirectionvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/animationspinloopdirectionvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/animationtypewritertextwritingstylevalues.md +18 -0
- package/assets/docs/guide/api/node/variables/animationwipedirectionvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/blendmodevalues.md +18 -0
- package/assets/docs/guide/api/node/variables/blur_types.md +21 -0
- package/assets/docs/guide/api/node/variables/cameraclampingovershootmodevalues.md +18 -0
- package/assets/docs/guide/api/node/variables/captionhorizontalalignmentvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/captionverticalalignmentvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/colorpickercolormodevalues.md +18 -0
- package/assets/docs/guide/api/node/variables/contentfillmodevalues.md +18 -0
- package/assets/docs/guide/api/node/variables/controlgizmomovehandlevisibilityvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/controlgizmoresizehandlesvisibilityvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/controlgizmorotatehandlesvisibilityvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/controlgizmoscalehandlesvisibilityvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/cutouttypevalues.md +18 -0
- package/assets/docs/guide/api/node/variables/design_block_types.md +21 -0
- package/assets/docs/guide/api/node/variables/doubleclickselectionmodevalues.md +18 -0
- package/assets/docs/guide/api/node/variables/effect_types.md +21 -0
- package/assets/docs/guide/api/node/variables/fill_types.md +21 -0
- package/assets/docs/guide/api/node/variables/fillpixelstreamorientationvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/heightmodevalues.md +18 -0
- package/assets/docs/guide/api/node/variables/horizontalcontentfillalignmentvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/loglevel.md +37 -0
- package/assets/docs/guide/api/node/variables/mimetype.md +41 -0
- package/assets/docs/guide/api/node/variables/pageguidessourcevalues.md +18 -0
- package/assets/docs/guide/api/node/variables/positionxmodevalues.md +18 -0
- package/assets/docs/guide/api/node/variables/positionymodevalues.md +18 -0
- package/assets/docs/guide/api/node/variables/scenedesignunitvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/scenefontsizeunitvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/scenelayoutvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/scenemodevalues.md +18 -0
- package/assets/docs/guide/api/node/variables/shape_types.md +21 -0
- package/assets/docs/guide/api/node/variables/shapevectorpathfillrulevalues.md +18 -0
- package/assets/docs/guide/api/node/variables/strokecapvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/strokecornergeometryvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/strokedashendcapvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/strokedashstartcapvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/strokeendcapvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/strokepositionvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/strokestartcapvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/strokestylevalues.md +18 -0
- package/assets/docs/guide/api/node/variables/textanimationwritingstylevalues.md +18 -0
- package/assets/docs/guide/api/node/variables/texthorizontalalignmentvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/textverticalalignmentvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/timelinetrackvisibilityvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/touchpinchactionvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/touchrotateactionvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/verticalcontentfillalignmentvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/widthmodevalues.md +18 -0
- package/assets/docs/guide/api/types.md +5 -9
- package/assets/docs/guide/api-reference/overview.md +7 -7
- package/assets/docs/guide/automation/auto-resize.md +263 -300
- package/assets/docs/guide/automation/data-merge.md +246 -275
- package/assets/docs/guide/automation/design-generation.md +102 -31
- package/assets/docs/guide/automation/multi-image-generation.md +758 -0
- package/assets/docs/guide/automation/overview.md +21 -4
- package/assets/docs/guide/automation.md +10 -5
- package/assets/docs/guide/capabilities.md +6 -4
- package/assets/docs/guide/colors/adjust.md +247 -249
- package/assets/docs/guide/colors/apply.md +127 -138
- package/assets/docs/guide/colors/basics.md +126 -150
- package/assets/docs/guide/colors/conversion.md +171 -177
- package/assets/docs/guide/colors/create-color-palette.md +244 -245
- package/assets/docs/guide/colors/extract-colors.md +144 -0
- package/assets/docs/guide/colors/for-print/cmyk.md +292 -352
- package/assets/docs/guide/colors/for-print/spot.md +521 -578
- package/assets/docs/guide/colors/for-print.md +9 -4
- package/assets/docs/guide/colors/for-screen/p3.md +12 -10
- package/assets/docs/guide/colors/for-screen/srgb.md +107 -133
- package/assets/docs/guide/colors/for-screen.md +9 -4
- package/assets/docs/guide/colors/overview.md +6 -4
- package/assets/docs/guide/colors/replace.md +381 -419
- package/assets/docs/guide/colors.md +9 -4
- package/assets/docs/guide/compatibility.md +7 -5
- package/assets/docs/guide/concepts/architecture.md +17 -15
- package/assets/docs/guide/concepts/assets.md +152 -140
- package/assets/docs/guide/concepts/blocks.md +227 -323
- package/assets/docs/guide/concepts/buffers.md +147 -276
- package/assets/docs/guide/concepts/design-units.md +95 -145
- package/assets/docs/guide/concepts/editing-workflow.md +69 -183
- package/assets/docs/guide/concepts/events.md +80 -122
- package/assets/docs/guide/concepts/headless-mode.md +237 -0
- package/assets/docs/guide/concepts/pages.md +137 -127
- package/assets/docs/guide/concepts/resources.md +156 -217
- package/assets/docs/guide/concepts/scenes.md +191 -210
- package/assets/docs/guide/concepts/templating.md +118 -74
- package/assets/docs/guide/concepts/terminology.md +49 -47
- package/assets/docs/guide/concepts/undo-and-history.md +229 -303
- package/assets/docs/guide/concepts.md +9 -7
- package/assets/docs/guide/configuration.md +252 -380
- package/assets/docs/guide/conversion/overview.md +33 -4
- package/assets/docs/guide/conversion/to-base64.md +127 -167
- package/assets/docs/guide/conversion/to-pdf.md +24 -474
- package/assets/docs/guide/conversion/to-png.md +168 -211
- package/assets/docs/guide/conversion.md +9 -4
- package/assets/docs/guide/create-audio/audio/add-music.md +301 -327
- package/assets/docs/guide/create-audio/audio/add-sound-effects.md +475 -359
- package/assets/docs/guide/create-audio/audio/loop.md +232 -272
- package/assets/docs/guide/create-composition/add-background.md +237 -239
- package/assets/docs/guide/create-composition/blend-modes.md +118 -209
- package/assets/docs/guide/create-composition/collage.md +538 -320
- package/assets/docs/guide/create-composition/group-and-ungroup.md +216 -261
- package/assets/docs/guide/create-composition/layer-management.md +219 -257
- package/assets/docs/guide/create-composition/layout.md +513 -315
- package/assets/docs/guide/create-composition/lock-design.md +90 -109
- package/assets/docs/guide/create-composition/multi-page.md +133 -113
- package/assets/docs/guide/create-composition/overview.md +16 -4
- package/assets/docs/guide/create-composition/programmatic.md +288 -344
- package/assets/docs/guide/create-composition.md +10 -5
- package/assets/docs/guide/create-templates/add-dynamic-content/placeholders.md +443 -569
- package/assets/docs/guide/create-templates/add-dynamic-content/set-editing-constraints.md +567 -470
- package/assets/docs/guide/create-templates/add-dynamic-content/text-variables.md +179 -516
- package/assets/docs/guide/create-templates/add-dynamic-content.md +226 -224
- package/assets/docs/guide/create-templates/add-to-template-library.md +183 -193
- package/assets/docs/guide/create-templates/edit-or-remove.md +297 -303
- package/assets/docs/guide/create-templates/from-scratch.md +207 -268
- package/assets/docs/guide/create-templates/import/from-scene-file.md +158 -236
- package/assets/docs/guide/create-templates/import.md +145 -161
- package/assets/docs/guide/create-templates/lock.md +42 -295
- package/assets/docs/guide/create-templates/overview.md +33 -4
- package/assets/docs/guide/create-templates.md +9 -5
- package/assets/docs/guide/create-video/audio/adjust-speed.md +157 -207
- package/assets/docs/guide/create-video/audio/adjust-volume.md +116 -227
- package/assets/docs/guide/create-video/control.md +352 -193
- package/assets/docs/guide/create-video/limitations.md +175 -280
- package/assets/docs/guide/create-video.md +11 -10
- package/assets/docs/guide/edit-image/add-watermark.md +283 -330
- package/assets/docs/guide/edit-image/overview.md +29 -4
- package/assets/docs/guide/edit-image/remove-bg.md +283 -337
- package/assets/docs/guide/edit-image/replace-colors.md +424 -502
- package/assets/docs/guide/edit-image/transform/crop.md +463 -402
- package/assets/docs/guide/edit-image/transform/flip.md +353 -0
- package/assets/docs/guide/edit-image/transform/move.md +143 -100
- package/assets/docs/guide/edit-image/transform/resize.md +118 -88
- package/assets/docs/guide/edit-image/transform/rotate.md +132 -165
- package/assets/docs/guide/edit-image/transform/scale.md +230 -228
- package/assets/docs/guide/edit-image/transform.md +10 -5
- package/assets/docs/guide/edit-image.md +11 -7
- package/assets/docs/guide/edit-video/add-captions.md +344 -421
- package/assets/docs/guide/edit-video/add-watermark.md +312 -258
- package/assets/docs/guide/edit-video/join-and-arrange.md +237 -371
- package/assets/docs/guide/edit-video/redaction.md +419 -385
- package/assets/docs/guide/edit-video/split.md +243 -493
- package/assets/docs/guide/edit-video/transform/crop.md +21 -352
- package/assets/docs/guide/edit-video/transform/flip.md +102 -76
- package/assets/docs/guide/edit-video/transform/move.md +258 -310
- package/assets/docs/guide/edit-video/transform/resize.md +264 -428
- package/assets/docs/guide/edit-video/transform/rotate.md +265 -228
- package/assets/docs/guide/edit-video/transform/scale.md +320 -417
- package/assets/docs/guide/edit-video/transform.md +10 -6
- package/assets/docs/guide/edit-video/trim.md +448 -494
- package/assets/docs/guide/engine-interface.md +51 -62
- package/assets/docs/guide/export-save-publish/create-thumbnail.md +148 -184
- package/assets/docs/guide/export-save-publish/export/compress.md +161 -559
- package/assets/docs/guide/export-save-publish/export/overview.md +224 -373
- package/assets/docs/guide/export-save-publish/export/partial-export.md +386 -577
- package/assets/docs/guide/export-save-publish/export/size-limits.md +215 -310
- package/assets/docs/guide/export-save-publish/export/to-jpeg.md +132 -213
- package/assets/docs/guide/export-save-publish/export/to-pdf.md +139 -267
- package/assets/docs/guide/export-save-publish/export/to-png.md +121 -165
- package/assets/docs/guide/export-save-publish/export/to-raw-data.md +187 -234
- package/assets/docs/guide/export-save-publish/export/to-webp.md +160 -190
- package/assets/docs/guide/export-save-publish/export/with-color-mask.md +359 -203
- package/assets/docs/guide/export-save-publish/export.md +14 -11
- package/assets/docs/guide/export-save-publish/for-printing.md +141 -237
- package/assets/docs/guide/export-save-publish/for-social-media.md +124 -261
- package/assets/docs/guide/export-save-publish/pre-export-validation.md +436 -522
- package/assets/docs/guide/export-save-publish/save.md +167 -226
- package/assets/docs/guide/export-save-publish/store-custom-metadata.md +97 -162
- package/assets/docs/guide/file-format-support.md +9 -9
- package/assets/docs/guide/fills/color.md +370 -347
- package/assets/docs/guide/fills/image.md +167 -196
- package/assets/docs/guide/fills/overview.md +6 -4
- package/assets/docs/guide/fills/video.md +286 -438
- package/assets/docs/guide/fills.md +12 -8
- package/assets/docs/guide/filters-and-effects/apply.md +598 -664
- package/assets/docs/guide/filters-and-effects/blur.md +261 -159
- package/assets/docs/guide/filters-and-effects/chroma-key-green-screen.md +194 -293
- package/assets/docs/guide/filters-and-effects/create-custom-filters.md +548 -466
- package/assets/docs/guide/filters-and-effects/create-custom-lut-filter.md +176 -244
- package/assets/docs/guide/filters-and-effects/distortion.md +317 -384
- package/assets/docs/guide/filters-and-effects/duotone.md +221 -217
- package/assets/docs/guide/filters-and-effects/gradients.md +670 -813
- package/assets/docs/guide/filters-and-effects/overview.md +7 -7
- package/assets/docs/guide/filters-and-effects/support.md +97 -132
- package/assets/docs/guide/filters-and-effects.md +11 -6
- package/assets/docs/guide/get-started/agent-skills.md +20 -18
- package/assets/docs/guide/get-started/build-with-ai.md +7 -4
- package/assets/docs/guide/get-started/bun.md +219 -0
- package/assets/docs/guide/get-started/deno.md +161 -0
- package/assets/docs/guide/get-started/mcp-server.md +6 -4
- package/assets/docs/guide/get-started/overview.md +11 -6
- package/assets/docs/guide/get-started/vanilla-aws-lambda.md +506 -0
- package/assets/docs/guide/get-started/vanilla-clone-github-project.md +124 -0
- package/assets/docs/guide/get-started/vanilla.md +235 -0
- package/assets/docs/guide/guides/export-save-publish/export/audio.md +80 -66
- package/assets/docs/guide/guides.md +10 -9
- package/assets/docs/guide/import-media/asset-panel/refresh-assets.md +259 -288
- package/assets/docs/guide/import-media/concepts.md +20 -38
- package/assets/docs/guide/import-media/content-json-schema.md +145 -125
- package/assets/docs/guide/import-media/default-assets.md +113 -161
- package/assets/docs/guide/import-media/edit-or-remove-assets.md +391 -395
- package/assets/docs/guide/import-media/file-format-support.md +78 -61
- package/assets/docs/guide/import-media/from-remote-source/asset-versioning.md +273 -244
- package/assets/docs/guide/import-media/from-remote-source/remote-asset.md +152 -222
- package/assets/docs/guide/import-media/from-remote-source.md +9 -11
- package/assets/docs/guide/import-media/overview.md +5 -5
- package/assets/docs/guide/import-media/retrieve-mimetype.md +216 -108
- package/assets/docs/guide/import-media/size-limits.md +6 -4
- package/assets/docs/guide/import-media/source-sets.md +190 -251
- package/assets/docs/guide/import-media.md +10 -8
- package/assets/docs/guide/insert-media/audio.md +202 -195
- package/assets/docs/guide/insert-media/images.md +190 -188
- package/assets/docs/guide/insert-media/position-and-align.md +284 -551
- package/assets/docs/guide/insert-media/shapes-or-stickers.md +402 -418
- package/assets/docs/guide/insert-media/videos.md +236 -203
- package/assets/docs/guide/insert-media.md +10 -5
- package/assets/docs/guide/key-capabilities.md +36 -4
- package/assets/docs/guide/key-concepts.md +6 -4
- package/assets/docs/guide/licensing.md +6 -4
- package/assets/docs/guide/llms-txt.md +11 -7
- package/assets/docs/guide/open-the-editor/blank-canvas.md +102 -63
- package/assets/docs/guide/open-the-editor/from-image.md +157 -127
- package/assets/docs/guide/open-the-editor/from-template.md +131 -92
- package/assets/docs/guide/open-the-editor/from-video.md +204 -212
- package/assets/docs/guide/open-the-editor/import-design/from-archive.md +310 -360
- package/assets/docs/guide/open-the-editor/import-design/from-indesign.md +716 -513
- package/assets/docs/guide/open-the-editor/import-design/from-photoshop.md +667 -695
- package/assets/docs/guide/open-the-editor/import-design.md +228 -266
- package/assets/docs/guide/open-the-editor/load-scene.md +72 -68
- package/assets/docs/guide/open-the-editor/overview.md +6 -4
- package/assets/docs/guide/open-the-editor/uri-resolver.md +160 -251
- package/assets/docs/guide/open-the-editor.md +11 -9
- package/assets/docs/guide/outlines/overview.md +12 -4
- package/assets/docs/guide/outlines/shadows-and-glows.md +105 -410
- package/assets/docs/guide/outlines/strokes.md +218 -166
- package/assets/docs/guide/outlines.md +9 -4
- package/assets/docs/guide/overview.md +14 -6
- package/assets/docs/guide/performance.md +220 -113
- package/assets/docs/guide/plugins/print-ready-pdf.md +273 -368
- package/assets/docs/guide/plugins.md +10 -16
- package/assets/docs/guide/rules/asset-handling.md +7 -18
- package/assets/docs/guide/rules/common-pitfalls.md +25 -42
- package/assets/docs/guide/rules/content-fill-mode.md +4 -4
- package/assets/docs/guide/rules/enforce-brand-guidelines.md +398 -567
- package/assets/docs/guide/rules/lock-content.md +188 -231
- package/assets/docs/guide/rules/moderate-content.md +580 -571
- package/assets/docs/guide/rules/overview.md +345 -380
- package/assets/docs/guide/rules/silent-init-errors.md +4 -1
- package/assets/docs/guide/rules/verify-properties-before-use.md +2 -11
- package/assets/docs/guide/rules.md +10 -5
- package/assets/docs/guide/security.md +7 -5
- package/assets/docs/guide/serve-assets.md +57 -284
- package/assets/docs/guide/settings.md +96 -74
- package/assets/docs/guide/shapes.md +10 -5
- package/assets/docs/guide/stickers-and-shapes/combine.md +397 -583
- package/assets/docs/guide/stickers-and-shapes/create-cutout.md +181 -268
- package/assets/docs/guide/stickers-and-shapes/create-edit/create-shapes.md +418 -431
- package/assets/docs/guide/stickers-and-shapes/create-edit/create-stickers.md +147 -226
- package/assets/docs/guide/stickers-and-shapes/create-edit/edit-shapes.md +138 -123
- package/assets/docs/guide/stickers-and-shapes/insert-qr-code.md +151 -149
- package/assets/docs/guide/stickers.md +9 -4
- package/assets/docs/guide/text/add.md +470 -482
- package/assets/docs/guide/text/adjust-spacing.md +179 -214
- package/assets/docs/guide/text/auto-size.md +210 -271
- package/assets/docs/guide/text/edit.md +294 -309
- package/assets/docs/guide/text/effects.md +154 -190
- package/assets/docs/guide/text/emojis.md +199 -232
- package/assets/docs/guide/text/language-support.md +369 -382
- package/assets/docs/guide/text/overview.md +41 -4
- package/assets/docs/guide/text/styling.md +239 -273
- package/assets/docs/guide/text/text-designs.md +405 -544
- package/assets/docs/guide/text.md +10 -9
- package/assets/docs/guide/to-v1-19.md +12 -10
- package/assets/docs/guide/upgrade.md +8 -9
- package/assets/docs/guide/use-templates/apply-template.md +174 -163
- package/assets/docs/guide/use-templates/generate.md +171 -152
- package/assets/docs/guide/use-templates/overview.md +32 -4
- package/assets/docs/guide/use-templates/programmatic.md +266 -301
- package/assets/docs/guide/use-templates/replace-content.md +181 -171
- package/assets/docs/guide/what-is-cesdk.md +71 -282
- package/assets/docs/handbook/SKILL.md +24 -0
- package/dist/assets/inline.generated.d.ts.map +1 -1
- package/dist/assets/inline.generated.js +544 -406
- package/dist/assets/inline.generated.js.map +1 -1
- package/dist/assets/load-browser.d.ts +1 -1
- package/dist/assets/load-browser.js +1 -1
- package/dist/assets/load-browser.js.map +1 -1
- package/dist/assets/load-node.d.ts +1 -1
- package/dist/assets/load-node.js +1 -1
- package/dist/assets/load-node.js.map +1 -1
- package/dist/cli/http.d.ts.map +1 -1
- package/dist/cli/http.js +4 -28
- package/dist/cli/http.js.map +1 -1
- package/dist/cli/redirect-console.d.ts +1 -1
- package/dist/cli/redirect-console.d.ts.map +1 -1
- package/dist/cli/redirect-console.js +12 -3
- package/dist/cli/redirect-console.js.map +1 -1
- package/dist/cli/resolve-license.d.ts.map +1 -1
- package/dist/cli/resolve-license.js +8 -6
- package/dist/cli/resolve-license.js.map +1 -1
- package/dist/cli/stdio.d.ts +9 -0
- package/dist/cli/stdio.d.ts.map +1 -1
- package/dist/cli/stdio.js +48 -4
- package/dist/cli/stdio.js.map +1 -1
- package/dist/cli.js +10 -1
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +11 -2
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +20 -1
- package/dist/config.js.map +1 -1
- package/dist/diagnostics/bundle.d.ts +10 -0
- package/dist/diagnostics/bundle.d.ts.map +1 -0
- package/dist/diagnostics/bundle.js +148 -0
- package/dist/diagnostics/bundle.js.map +1 -0
- package/dist/diagnostics/compose.d.ts +3 -0
- package/dist/diagnostics/compose.d.ts.map +1 -0
- package/dist/diagnostics/compose.js +15 -0
- package/dist/diagnostics/compose.js.map +1 -0
- package/dist/diagnostics/events.d.ts +34 -0
- package/dist/diagnostics/events.d.ts.map +1 -0
- package/dist/diagnostics/events.js +3 -0
- package/dist/diagnostics/events.js.map +1 -0
- package/dist/diagnostics/file-sink.d.ts +38 -0
- package/dist/diagnostics/file-sink.d.ts.map +1 -0
- package/dist/diagnostics/file-sink.js +157 -0
- package/dist/diagnostics/file-sink.js.map +1 -0
- package/dist/diagnostics/redact.d.ts +7 -0
- package/dist/diagnostics/redact.d.ts.map +1 -0
- package/dist/diagnostics/redact.js +43 -0
- package/dist/diagnostics/redact.js.map +1 -0
- package/dist/diagnostics/tool-call-adapter.d.ts +4 -0
- package/dist/diagnostics/tool-call-adapter.d.ts.map +1 -0
- package/dist/diagnostics/tool-call-adapter.js +21 -0
- package/dist/diagnostics/tool-call-adapter.js.map +1 -0
- package/dist/engine/cesdk-adapter.d.ts +5 -1
- package/dist/engine/cesdk-adapter.d.ts.map +1 -1
- package/dist/engine/cesdk-adapter.js +9 -2
- package/dist/engine/cesdk-adapter.js.map +1 -1
- package/dist/engine/index.d.ts +1 -0
- package/dist/engine/index.d.ts.map +1 -1
- package/dist/engine/index.js +4 -0
- package/dist/engine/index.js.map +1 -1
- package/dist/engine/scene-resource-schemes.d.ts +2 -0
- package/dist/engine/scene-resource-schemes.d.ts.map +1 -0
- package/dist/engine/scene-resource-schemes.js +20 -0
- package/dist/engine/scene-resource-schemes.js.map +1 -0
- package/dist/http/server.d.ts +0 -6
- package/dist/http/server.d.ts.map +1 -1
- package/dist/http/server.js +1 -2
- package/dist/http/server.js.map +1 -1
- package/dist/server.d.ts +0 -4
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +4 -60
- package/dist/server.js.map +1 -1
- package/dist/test/scripts/changelog-add.d.ts +8 -0
- package/dist/test/scripts/changelog-add.d.ts.map +1 -0
- package/dist/test/scripts/changelog-add.js +50 -0
- package/dist/test/scripts/changelog-add.js.map +1 -0
- package/dist/test/scripts/changelog-collate.d.ts +38 -0
- package/dist/test/scripts/changelog-collate.d.ts.map +1 -0
- package/dist/test/scripts/changelog-collate.js +171 -0
- package/dist/test/scripts/changelog-collate.js.map +1 -0
- package/dist/test/test/changelog.test.d.ts +2 -0
- package/dist/test/test/changelog.test.d.ts.map +1 -0
- package/dist/test/test/changelog.test.js +293 -0
- package/dist/test/test/changelog.test.js.map +1 -0
- package/dist/test/test/cli/dispatcher.test.js +10 -3
- package/dist/test/test/cli/dispatcher.test.js.map +1 -1
- package/dist/test/test/cli/redirect-console.test.js +31 -0
- package/dist/test/test/cli/redirect-console.test.js.map +1 -1
- package/dist/test/test/cli/resolve-license.test.js +10 -1
- package/dist/test/test/cli/resolve-license.test.js.map +1 -1
- package/dist/test/test/cli/stdio-diagnostics.test.d.ts +2 -0
- package/dist/test/test/cli/stdio-diagnostics.test.d.ts.map +1 -0
- package/dist/test/test/cli/stdio-diagnostics.test.js +31 -0
- package/dist/test/test/cli/stdio-diagnostics.test.js.map +1 -0
- package/dist/test/test/config.test.js +17 -13
- package/dist/test/test/config.test.js.map +1 -1
- package/dist/test/test/diagnostics/bundle.test.d.ts +2 -0
- package/dist/test/test/diagnostics/bundle.test.d.ts.map +1 -0
- package/dist/test/test/diagnostics/bundle.test.js +53 -0
- package/dist/test/test/diagnostics/bundle.test.js.map +1 -0
- package/dist/test/test/diagnostics/compose.test.d.ts +2 -0
- package/dist/test/test/diagnostics/compose.test.d.ts.map +1 -0
- package/dist/test/test/diagnostics/compose.test.js +31 -0
- package/dist/test/test/diagnostics/compose.test.js.map +1 -0
- package/dist/test/test/diagnostics/file-sink.test.d.ts +2 -0
- package/dist/test/test/diagnostics/file-sink.test.d.ts.map +1 -0
- package/dist/test/test/diagnostics/file-sink.test.js +113 -0
- package/dist/test/test/diagnostics/file-sink.test.js.map +1 -0
- package/dist/test/test/diagnostics/redact.test.d.ts +2 -0
- package/dist/test/test/diagnostics/redact.test.d.ts.map +1 -0
- package/dist/test/test/diagnostics/redact.test.js +59 -0
- package/dist/test/test/diagnostics/redact.test.js.map +1 -0
- package/dist/test/test/diagnostics/tool-call-adapter.test.d.ts +2 -0
- package/dist/test/test/diagnostics/tool-call-adapter.test.d.ts.map +1 -0
- package/dist/test/test/diagnostics/tool-call-adapter.test.js +34 -0
- package/dist/test/test/diagnostics/tool-call-adapter.test.js.map +1 -0
- package/dist/test/test/engine/cesdk-adapter.test.d.ts +2 -0
- package/dist/test/test/engine/cesdk-adapter.test.d.ts.map +1 -0
- package/dist/test/test/engine/cesdk-adapter.test.js +32 -0
- package/dist/test/test/engine/cesdk-adapter.test.js.map +1 -0
- package/dist/test/test/handbook-contract.test.js +6 -2
- package/dist/test/test/handbook-contract.test.js.map +1 -1
- package/dist/test/test/http/server.test.js +0 -36
- package/dist/test/test/http/server.test.js.map +1 -1
- package/dist/test/test/http/workspace-auth.test.js +0 -1
- package/dist/test/test/http/workspace-auth.test.js.map +1 -1
- package/dist/test/test/server.test.js +0 -40
- package/dist/test/test/server.test.js.map +1 -1
- package/dist/test/test/tools/edit-harness.d.ts +14 -0
- package/dist/test/test/tools/edit-harness.d.ts.map +1 -0
- package/dist/test/test/tools/edit-harness.js +30 -0
- package/dist/test/test/tools/edit-harness.js.map +1 -0
- package/dist/test/test/tools/edit.telemetry.test.d.ts +2 -0
- package/dist/test/test/tools/edit.telemetry.test.d.ts.map +1 -0
- package/dist/test/test/tools/edit.telemetry.test.js +46 -0
- package/dist/test/test/tools/edit.telemetry.test.js.map +1 -0
- package/dist/test/test/tools/export-harness.d.ts +13 -0
- package/dist/test/test/tools/export-harness.d.ts.map +1 -0
- package/dist/test/test/tools/export-harness.js +27 -0
- package/dist/test/test/tools/export-harness.js.map +1 -0
- package/dist/test/test/tools/export.telemetry.test.d.ts +2 -0
- package/dist/test/test/tools/export.telemetry.test.d.ts.map +1 -0
- package/dist/test/test/tools/export.telemetry.test.js +65 -0
- package/dist/test/test/tools/export.telemetry.test.js.map +1 -0
- package/dist/test/test/tools/import.test.d.ts +2 -0
- package/dist/test/test/tools/import.test.d.ts.map +1 -0
- package/dist/test/test/tools/import.test.js +122 -0
- package/dist/test/test/tools/import.test.js.map +1 -0
- package/dist/test/test/tools/index.test.js +78 -16
- package/dist/test/test/tools/index.test.js.map +1 -1
- package/dist/test/test/tools/load.integration.test.d.ts +2 -0
- package/dist/test/test/tools/load.integration.test.d.ts.map +1 -0
- package/dist/test/test/tools/load.integration.test.js +165 -0
- package/dist/test/test/tools/load.integration.test.js.map +1 -0
- package/dist/test/test/tools/load.test.d.ts +2 -0
- package/dist/test/test/tools/load.test.d.ts.map +1 -0
- package/dist/test/test/tools/load.test.js +387 -0
- package/dist/test/test/tools/load.test.js.map +1 -0
- package/dist/test/test/tools/preview-harness.d.ts +9 -0
- package/dist/test/test/tools/preview-harness.d.ts.map +1 -0
- package/dist/test/test/tools/preview-harness.js +23 -0
- package/dist/test/test/tools/preview-harness.js.map +1 -0
- package/dist/test/test/tools/preview.telemetry.test.d.ts +2 -0
- package/dist/test/test/tools/preview.telemetry.test.d.ts.map +1 -0
- package/dist/test/test/tools/preview.telemetry.test.js +36 -0
- package/dist/test/test/tools/preview.telemetry.test.js.map +1 -0
- package/dist/test/test/tools/schema-best-practices.d.ts +13 -0
- package/dist/test/test/tools/schema-best-practices.d.ts.map +1 -0
- package/dist/test/test/tools/schema-best-practices.js +169 -0
- package/dist/test/test/tools/schema-best-practices.js.map +1 -0
- package/dist/test/test/tools/schema-best-practices.test.d.ts +3 -0
- package/dist/test/test/tools/schema-best-practices.test.d.ts.map +1 -0
- package/dist/test/test/tools/schema-best-practices.test.js +194 -0
- package/dist/test/test/tools/schema-best-practices.test.js.map +1 -0
- package/dist/test/test/tools/spans.test.d.ts +2 -0
- package/dist/test/test/tools/spans.test.d.ts.map +1 -0
- package/dist/test/test/tools/spans.test.js +84 -0
- package/dist/test/test/tools/spans.test.js.map +1 -0
- package/dist/test/test/viewer/cesdk-cdn.test.d.ts +2 -0
- package/dist/test/test/viewer/cesdk-cdn.test.d.ts.map +1 -0
- package/dist/test/test/viewer/cesdk-cdn.test.js +19 -0
- package/dist/test/test/viewer/cesdk-cdn.test.js.map +1 -0
- package/dist/test/test/viewer/config-route.test.d.ts +2 -0
- package/dist/test/test/viewer/config-route.test.d.ts.map +1 -0
- package/dist/test/test/viewer/config-route.test.js +28 -0
- package/dist/test/test/viewer/config-route.test.js.map +1 -0
- package/dist/test/test/viewer/spa-version.test.d.ts +2 -0
- package/dist/test/test/viewer/spa-version.test.d.ts.map +1 -0
- package/dist/test/test/viewer/spa-version.test.js +14 -0
- package/dist/test/test/viewer/spa-version.test.js.map +1 -0
- package/dist/test/test/workspace/content-hash.test.d.ts +2 -0
- package/dist/test/test/workspace/content-hash.test.d.ts.map +1 -0
- package/dist/test/test/workspace/content-hash.test.js +17 -0
- package/dist/test/test/workspace/content-hash.test.js.map +1 -0
- package/dist/test/tsconfig.test.tsbuildinfo +1 -1
- package/dist/test/vitest.config.js +1 -1
- package/dist/test/vitest.config.js.map +1 -1
- package/dist/tools/asset-generate.d.ts.map +1 -1
- package/dist/tools/asset-generate.js +1 -8
- package/dist/tools/asset-generate.js.map +1 -1
- package/dist/tools/edit.d.ts +3 -0
- package/dist/tools/edit.d.ts.map +1 -1
- package/dist/tools/edit.js +145 -96
- package/dist/tools/edit.js.map +1 -1
- package/dist/tools/export.d.ts +3 -0
- package/dist/tools/export.d.ts.map +1 -1
- package/dist/tools/export.js +146 -108
- package/dist/tools/export.js.map +1 -1
- package/dist/tools/import.d.ts +12 -0
- package/dist/tools/import.d.ts.map +1 -0
- package/dist/tools/import.js +144 -0
- package/dist/tools/import.js.map +1 -0
- package/dist/tools/index.d.ts +3 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +44 -4
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/load.d.ts +26 -0
- package/dist/tools/load.d.ts.map +1 -0
- package/dist/tools/load.js +400 -0
- package/dist/tools/load.js.map +1 -0
- package/dist/tools/preview.d.ts +3 -0
- package/dist/tools/preview.d.ts.map +1 -1
- package/dist/tools/preview.js +79 -44
- package/dist/tools/preview.js.map +1 -1
- package/dist/tools/result.d.ts +1 -1
- package/dist/tools/result.js +2 -2
- package/dist/tools/result.js.map +1 -1
- package/dist/tools/spans.d.ts +45 -0
- package/dist/tools/spans.d.ts.map +1 -0
- package/dist/tools/spans.js +77 -0
- package/dist/tools/spans.js.map +1 -0
- package/dist/tools/telemetry-wrapper.d.ts +4 -0
- package/dist/tools/telemetry-wrapper.d.ts.map +1 -0
- package/dist/tools/telemetry-wrapper.js +43 -0
- package/dist/tools/telemetry-wrapper.js.map +1 -0
- package/dist/viewer/cesdk-cdn.d.ts +16 -0
- package/dist/viewer/cesdk-cdn.d.ts.map +1 -0
- package/dist/viewer/cesdk-cdn.js +30 -0
- package/dist/viewer/cesdk-cdn.js.map +1 -0
- package/dist/viewer/router.d.ts +6 -0
- package/dist/viewer/router.d.ts.map +1 -1
- package/dist/viewer/router.js +4 -1
- package/dist/viewer/router.js.map +1 -1
- package/dist/viewer/spa-assets.generated.d.ts.map +1 -1
- package/dist/viewer/spa-assets.generated.js +2 -3
- package/dist/viewer/spa-assets.generated.js.map +1 -1
- package/dist/workspace/content-hash.d.ts +2 -0
- package/dist/workspace/content-hash.d.ts.map +1 -0
- package/dist/workspace/content-hash.js +15 -0
- package/dist/workspace/content-hash.js.map +1 -0
- package/package.json +18 -9
- package/assets/docs/guide/actions.md +0 -1038
- package/assets/docs/guide/animation/overview.md +0 -22
- package/assets/docs/guide/automation/batch-processing.md +0 -474
- package/assets/docs/guide/browser-support.md +0 -38
- package/assets/docs/guide/concepts/edit-modes.md +0 -431
- package/assets/docs/guide/concepts/headless-mode/browser.md +0 -291
- package/assets/docs/guide/create-audio/audio.md +0 -336
- package/assets/docs/guide/create-video/overview.md +0 -224
- package/assets/docs/guide/create-video/timeline-editor.md +0 -622
- package/assets/docs/guide/create-video/update-caption-presets.md +0 -676
- package/assets/docs/guide/edit-image/vectorize.md +0 -204
- package/assets/docs/guide/export-save-publish/export/to-html5.md +0 -474
- package/assets/docs/guide/export-save-publish/export/to-mp4.md +0 -364
- package/assets/docs/guide/get-started/vanilla-js/quickstart.md +0 -175
- package/assets/docs/guide/grid-and-rulers.md +0 -222
- package/assets/docs/guide/guides/text/rendering-internals.md +0 -796
- package/assets/docs/guide/import-media/asset-library.md +0 -23
- package/assets/docs/guide/import-media/asset-panel/basics.md +0 -324
- package/assets/docs/guide/import-media/asset-panel/customize.md +0 -478
- package/assets/docs/guide/import-media/asset-panel/thumbnails.md +0 -633
- package/assets/docs/guide/import-media/capture-from-camera/record-video.md +0 -137
- package/assets/docs/guide/import-media/capture-from-camera.md +0 -20
- package/assets/docs/guide/import-media/from-local-source/user-upload.md +0 -438
- package/assets/docs/guide/import-media/from-local-source.md +0 -20
- package/assets/docs/guide/import-media/from-remote-source/getty-images.md +0 -627
- package/assets/docs/guide/import-media/from-remote-source/imgly-premium-assets.md +0 -625
- package/assets/docs/guide/import-media/from-remote-source/pexels.md +0 -692
- package/assets/docs/guide/import-media/from-remote-source/soundstripe.md +0 -497
- package/assets/docs/guide/import-media/from-remote-source/third-party.md +0 -51
- package/assets/docs/guide/import-media/from-remote-source/unsplash.md +0 -914
- package/assets/docs/guide/import-media/from-remote-source/your-server.md +0 -764
- package/assets/docs/guide/open-the-editor/from-htmlcanvas.md +0 -228
- package/assets/docs/guide/open-the-editor/set-zoom-level.md +0 -303
- package/assets/docs/guide/plugins/asset-sources.md +0 -553
- package/assets/docs/guide/starterkits/3d-mockup-editor.md +0 -748
- package/assets/docs/guide/starterkits/advanced-editor.md +0 -698
- package/assets/docs/guide/starterkits/advanced-video-editor.md +0 -696
- package/assets/docs/guide/starterkits/ai-editor.md +0 -749
- package/assets/docs/guide/starterkits/airtable-image-editor.md +0 -672
- package/assets/docs/guide/starterkits/apparel-ui.md +0 -188
- package/assets/docs/guide/starterkits/assets.md +0 -27
- package/assets/docs/guide/starterkits/auto-resize.md +0 -586
- package/assets/docs/guide/starterkits/automated-video-generation.md +0 -692
- package/assets/docs/guide/starterkits/background-removal-editor.md +0 -480
- package/assets/docs/guide/starterkits/content-moderation.md +0 -863
- package/assets/docs/guide/starterkits/creative-automation.md +0 -28
- package/assets/docs/guide/starterkits/custom-built-uis.md +0 -26
- package/assets/docs/guide/starterkits/customization.md +0 -29
- package/assets/docs/guide/starterkits/cutout-lines-editor.md +0 -470
- package/assets/docs/guide/starterkits/data-merge.md +0 -850
- package/assets/docs/guide/starterkits/design-editor.md +0 -698
- package/assets/docs/guide/starterkits/design-generation.md +0 -719
- package/assets/docs/guide/starterkits/design-validation.md +0 -808
- package/assets/docs/guide/starterkits/editor-ui-configurations.md +0 -14
- package/assets/docs/guide/starterkits/export-options.md +0 -724
- package/assets/docs/guide/starterkits/export-using-renderer.md +0 -708
- package/assets/docs/guide/starterkits/extensibility.md +0 -28
- package/assets/docs/guide/starterkits/force-crop-editor.md +0 -675
- package/assets/docs/guide/starterkits/form-based-template-adoption.md +0 -522
- package/assets/docs/guide/starterkits/getty-images-editor.md +0 -700
- package/assets/docs/guide/starterkits/html5-ads-exporter.md +0 -719
- package/assets/docs/guide/starterkits/indesign-template-import.md +0 -580
- package/assets/docs/guide/starterkits/layouts-editor.md +0 -724
- package/assets/docs/guide/starterkits/mobile-ui.md +0 -185
- package/assets/docs/guide/starterkits/mockup-editor.md +0 -745
- package/assets/docs/guide/starterkits/multi-image-generation.md +0 -542
- package/assets/docs/guide/starterkits/page-sizes-editor.md +0 -657
- package/assets/docs/guide/starterkits/pexels-image-editor.md +0 -665
- package/assets/docs/guide/starterkits/photo-editor.md +0 -755
- package/assets/docs/guide/starterkits/photo-ui.md +0 -186
- package/assets/docs/guide/starterkits/photobook-ui.md +0 -188
- package/assets/docs/guide/starterkits/placeholders.md +0 -678
- package/assets/docs/guide/starterkits/player.md +0 -405
- package/assets/docs/guide/starterkits/plugins.md +0 -25
- package/assets/docs/guide/starterkits/postcard-editor.md +0 -202
- package/assets/docs/guide/starterkits/pptx-template-import.md +0 -581
- package/assets/docs/guide/starterkits/print-ready-pdf-editor.md +0 -746
- package/assets/docs/guide/starterkits/product-editor.md +0 -773
- package/assets/docs/guide/starterkits/psd-template-import.md +0 -580
- package/assets/docs/guide/starterkits/qr-code-editor.md +0 -470
- package/assets/docs/guide/starterkits/single-page-editor.md +0 -661
- package/assets/docs/guide/starterkits/start-with-image.md +0 -684
- package/assets/docs/guide/starterkits/start-with-video.md +0 -651
- package/assets/docs/guide/starterkits/t-shirt-designer.md +0 -742
- package/assets/docs/guide/starterkits/templating.md +0 -23
- package/assets/docs/guide/starterkits/theming.md +0 -662
- package/assets/docs/guide/starterkits/translation-internationalization.md +0 -662
- package/assets/docs/guide/starterkits/unsplash-editor.md +0 -839
- package/assets/docs/guide/starterkits/vectorizer-editor.md +0 -466
- package/assets/docs/guide/starterkits/version-history.md +0 -745
- package/assets/docs/guide/starterkits/video-animations.md +0 -853
- package/assets/docs/guide/starterkits/video-captions.md +0 -884
- package/assets/docs/guide/starterkits/video-editing.md +0 -25
- package/assets/docs/guide/starterkits/video-editor.md +0 -696
- package/assets/docs/guide/starterkits/video-export-options.md +0 -676
- package/assets/docs/guide/starterkits/viewer.md +0 -400
- package/assets/docs/guide/starterkits.md +0 -41
- package/assets/docs/guide/stickers-and-shapes/create-edit/vector-edit.md +0 -362
- package/assets/docs/guide/text/custom-fonts.md +0 -401
- package/assets/docs/guide/text/decorations.md +0 -330
- package/assets/docs/guide/text/enumerations.md +0 -258
- package/assets/docs/guide/to-v1-10.md +0 -131
- package/assets/docs/guide/to-v1-13.md +0 -165
- package/assets/docs/guide/to-v1-32.md +0 -110
- package/assets/docs/guide/to-v1-69.md +0 -468
- package/assets/docs/guide/to-v1-72.md +0 -193
- package/assets/docs/guide/use-templates/library.md +0 -450
- package/assets/docs/guide/user-interface/ai-integration/audio-generation.md +0 -428
- package/assets/docs/guide/user-interface/ai-integration/auto-captions.md +0 -337
- package/assets/docs/guide/user-interface/ai-integration/custom-provider.md +0 -853
- package/assets/docs/guide/user-interface/ai-integration/gateway-provider.md +0 -1045
- package/assets/docs/guide/user-interface/ai-integration/image-generation.md +0 -641
- package/assets/docs/guide/user-interface/ai-integration/integrate.md +0 -966
- package/assets/docs/guide/user-interface/ai-integration/proxy-server.md +0 -99
- package/assets/docs/guide/user-interface/ai-integration/text-generation.md +0 -498
- package/assets/docs/guide/user-interface/ai-integration/video-generation.md +0 -493
- package/assets/docs/guide/user-interface/ai-integration.md +0 -30
- package/assets/docs/guide/user-interface/appearance/change-ui-font.md +0 -316
- package/assets/docs/guide/user-interface/appearance/custom-labels.md +0 -509
- package/assets/docs/guide/user-interface/appearance/icons.md +0 -373
- package/assets/docs/guide/user-interface/appearance/theming.md +0 -665
- package/assets/docs/guide/user-interface/appearance.md +0 -23
- package/assets/docs/guide/user-interface/build-your-own-ui.md +0 -620
- package/assets/docs/guide/user-interface/customization/canvas-menu.md +0 -412
- package/assets/docs/guide/user-interface/customization/canvas.md +0 -281
- package/assets/docs/guide/user-interface/customization/color-palette.md +0 -413
- package/assets/docs/guide/user-interface/customization/crop-presets.md +0 -384
- package/assets/docs/guide/user-interface/customization/disable-or-enable.md +0 -676
- package/assets/docs/guide/user-interface/customization/dock.md +0 -399
- package/assets/docs/guide/user-interface/customization/force-crop.md +0 -289
- package/assets/docs/guide/user-interface/customization/inspector-bar.md +0 -371
- package/assets/docs/guide/user-interface/customization/navigation-bar.md +0 -516
- package/assets/docs/guide/user-interface/customization/page-format.md +0 -436
- package/assets/docs/guide/user-interface/customization/panel.md +0 -605
- package/assets/docs/guide/user-interface/customization/quick-start/add-action-buttons.md +0 -531
- package/assets/docs/guide/user-interface/customization/quick-start/add-dock-buttons.md +0 -358
- package/assets/docs/guide/user-interface/customization/quick-start/create-custom-components.md +0 -374
- package/assets/docs/guide/user-interface/customization/quick-start/reorder-components.md +0 -323
- package/assets/docs/guide/user-interface/customization/quick-start/show-hide-components.md +0 -294
- package/assets/docs/guide/user-interface/customization/quick-start.md +0 -12
- package/assets/docs/guide/user-interface/customization/reference/component-order-api.md +0 -519
- package/assets/docs/guide/user-interface/customization/reference/component-reference.md +0 -333
- package/assets/docs/guide/user-interface/customization/reference.md +0 -12
- package/assets/docs/guide/user-interface/customization.md +0 -39
- package/assets/docs/guide/user-interface/localization.md +0 -633
- package/assets/docs/guide/user-interface/overview.md +0 -167
- package/assets/docs/guide/user-interface/ui-extensions/add-custom-feature.md +0 -411
- package/assets/docs/guide/user-interface/ui-extensions/asset-library.md +0 -721
- package/assets/docs/guide/user-interface/ui-extensions/create-custom-panel.md +0 -331
- package/assets/docs/guide/user-interface/ui-extensions/customize-behaviour.md +0 -553
- package/assets/docs/guide/user-interface/ui-extensions/notifications-and-dialogs.md +0 -672
- package/assets/docs/guide/user-interface/ui-extensions/quick-actions.md +0 -415
- package/assets/docs/guide/user-interface/ui-extensions/register-new-component.md +0 -521
- package/assets/docs/guide/user-interface/ui-extensions.md +0 -26
- package/assets/docs/guide/user-interface.md +0 -25
- package/assets/prompts/evals-assetGenerate.md +0 -12
- package/assets/prompts/evals-brutalistCore.md +0 -34
- package/assets/prompts/evals-danskCatalogue.md +0 -31
- package/assets/prompts/evals-exportRoundTrip.md +0 -12
- package/assets/prompts/evals-inspectPriorCode.md +0 -16
- package/assets/prompts/evals-listProjectFiles.md +0 -6
- package/assets/prompts/evals-readAndExplainScript.md +0 -6
- package/assets/prompts/evals-resumeAcrossRestart.md +0 -15
- package/assets/prompts/evals-rewindRecovery.md +0 -10
- package/assets/prompts/evals-searchAcrossFiles.md +0 -6
- package/assets/prompts/evals-weddingCard.md +0 -20
- package/assets/prompts/explain.md +0 -6
- package/assets/prompts/review.md +0 -6
- package/dist/frontmatter.d.ts +0 -15
- package/dist/frontmatter.d.ts.map +0 -1
- package/dist/frontmatter.js +0 -46
- package/dist/frontmatter.js.map +0 -1
- package/dist/test/test/frontmatter.test.d.ts +0 -2
- package/dist/test/test/frontmatter.test.d.ts.map +0 -1
- package/dist/test/test/frontmatter.test.js +0 -55
- package/dist/test/test/frontmatter.test.js.map +0 -1
|
@@ -1,354 +1,291 @@
|
|
|
1
|
-
> This is one page of the CE.SDK
|
|
1
|
+
> This is one page of the CE.SDK Node.js documentation. For a complete overview, see the [Node.js Documentation Index](https://img.ly/docs/cesdk/node.md). For all docs in one file, see [llms-full.txt](./llms-full.txt.md).
|
|
2
2
|
|
|
3
3
|
**Navigation:** [Guides](./guides.md) > [Create and Edit Videos](./create-video.md) > [Trim](./edit-video/trim.md)
|
|
4
4
|
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
Control video playback timing by trimming clips to specific start points and
|
|
8
|
-
durations using CE.SDK's
|
|
8
|
+
durations using CE.SDK's programmatic trim API in headless mode.
|
|
9
9
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
> **Reading time:** 12 minutes
|
|
10
|
+
> **Reading time:** 10 minutes
|
|
13
11
|
>
|
|
14
12
|
> **Resources:**
|
|
15
13
|
>
|
|
16
14
|
> - [Download examples](https://github.com/imgly/cesdk-web-examples/archive/refs/tags/release-$UBQ_VERSION$.zip)
|
|
17
|
-
>
|
|
18
|
-
> - [
|
|
19
|
-
>
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
FiltersAssetSource,
|
|
34
|
-
PagePresetsAssetSource,
|
|
35
|
-
StickerAssetSource,
|
|
36
|
-
TextAssetSource,
|
|
37
|
-
TextComponentAssetSource,
|
|
38
|
-
TypefaceAssetSource,
|
|
39
|
-
UploadAssetSources,
|
|
40
|
-
VectorShapeAssetSource
|
|
41
|
-
} from '@cesdk/cesdk-js/plugins';
|
|
42
|
-
import { VideoEditorConfig } from './video-editor/plugin';
|
|
43
|
-
import packageJson from './package.json';
|
|
44
|
-
import { calculateGridLayout } from './utils';
|
|
15
|
+
>
|
|
16
|
+
> - [View source on GitHub](https://github.com/imgly/cesdk-web-examples/tree/release-$UBQ_VERSION$/guides-create-video-trim-server-js)
|
|
17
|
+
>
|
|
18
|
+
> - [Open in StackBlitz](https://stackblitz.com/github/imgly/cesdk-web-examples/tree/v$UBQ_VERSION$/guides-create-video-trim-server-js)
|
|
19
|
+
|
|
20
|
+
<NodejsVideoExportNotice {...props} />
|
|
21
|
+
|
|
22
|
+
Understanding the difference between **fill-level trimming** and **block-level timing** is key. Fill-level trimming (`setTrimOffset`, `setTrimLength`) controls which portion of the source media plays, while block-level timing (`setTimeOffset`, `setDuration`) controls when and how long the block appears in the composition. These two systems work together to give you complete control over video playback.
|
|
23
|
+
|
|
24
|
+
```typescript file=@cesdk_web_examples/guides-create-video-trim-server-js/server-js.ts reference-only
|
|
25
|
+
import CreativeEngine from '@cesdk/node';
|
|
26
|
+
import { config } from 'dotenv';
|
|
27
|
+
import { writeFileSync, mkdirSync, existsSync } from 'fs';
|
|
28
|
+
|
|
29
|
+
// Load environment variables
|
|
30
|
+
config();
|
|
45
31
|
|
|
46
32
|
/**
|
|
47
|
-
* CE.SDK
|
|
33
|
+
* CE.SDK Server Guide: Trim Video and Audio
|
|
48
34
|
*
|
|
49
|
-
* Demonstrates trimming video clips in
|
|
35
|
+
* Demonstrates trimming video clips in headless mode:
|
|
50
36
|
* - Loading video resources with forceLoadAVResource
|
|
51
37
|
* - Basic video trimming with setTrimOffset/setTrimLength
|
|
52
38
|
* - Getting current trim values
|
|
39
|
+
* - Getting source media duration
|
|
53
40
|
* - Coordinating trim with block duration
|
|
54
41
|
* - Trimming with looping enabled
|
|
55
42
|
* - Checking trim support
|
|
56
43
|
* - Frame-accurate trimming
|
|
57
44
|
* - Batch trimming multiple videos
|
|
45
|
+
* - Saving the scene for later use
|
|
58
46
|
*/
|
|
59
|
-
class Example implements EditorPlugin {
|
|
60
|
-
name = packageJson.name;
|
|
61
|
-
|
|
62
|
-
version = packageJson.version;
|
|
63
|
-
|
|
64
|
-
async initialize({ cesdk }: EditorPluginContext): Promise<void> {
|
|
65
|
-
if (!cesdk) {
|
|
66
|
-
throw new Error('CE.SDK instance is required for this plugin');
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
await cesdk.addPlugin(new VideoEditorConfig());
|
|
70
|
-
|
|
71
|
-
// Add asset source plugins
|
|
72
|
-
await cesdk.addPlugin(new BlurAssetSource());
|
|
73
|
-
await cesdk.addPlugin(new CaptionPresetsAssetSource());
|
|
74
|
-
await cesdk.addPlugin(new ColorPaletteAssetSource());
|
|
75
|
-
await cesdk.addPlugin(new CropPresetsAssetSource());
|
|
76
|
-
await cesdk.addPlugin(
|
|
77
|
-
new UploadAssetSources({
|
|
78
|
-
include: [
|
|
79
|
-
'ly.img.image.upload',
|
|
80
|
-
'ly.img.video.upload',
|
|
81
|
-
'ly.img.audio.upload'
|
|
82
|
-
]
|
|
83
|
-
})
|
|
84
|
-
);
|
|
85
|
-
await cesdk.addPlugin(
|
|
86
|
-
new DemoAssetSources({
|
|
87
|
-
include: [
|
|
88
|
-
'ly.img.templates.video.*',
|
|
89
|
-
'ly.img.image.*',
|
|
90
|
-
'ly.img.audio.*',
|
|
91
|
-
'ly.img.video.*'
|
|
92
|
-
]
|
|
93
|
-
})
|
|
94
|
-
);
|
|
95
|
-
await cesdk.addPlugin(new EffectsAssetSource());
|
|
96
|
-
await cesdk.addPlugin(new FiltersAssetSource());
|
|
97
|
-
await cesdk.addPlugin(
|
|
98
|
-
new PagePresetsAssetSource({
|
|
99
|
-
include: [
|
|
100
|
-
'ly.img.page.presets.instagram.*',
|
|
101
|
-
'ly.img.page.presets.facebook.*',
|
|
102
|
-
'ly.img.page.presets.x.*',
|
|
103
|
-
'ly.img.page.presets.linkedin.*',
|
|
104
|
-
'ly.img.page.presets.pinterest.*',
|
|
105
|
-
'ly.img.page.presets.tiktok.*',
|
|
106
|
-
'ly.img.page.presets.youtube.*',
|
|
107
|
-
'ly.img.page.presets.video.*'
|
|
108
|
-
]
|
|
109
|
-
})
|
|
110
|
-
);
|
|
111
|
-
await cesdk.addPlugin(new StickerAssetSource());
|
|
112
|
-
await cesdk.addPlugin(new TextAssetSource());
|
|
113
|
-
await cesdk.addPlugin(new TextComponentAssetSource());
|
|
114
|
-
await cesdk.addPlugin(new TypefaceAssetSource());
|
|
115
|
-
await cesdk.addPlugin(new VectorShapeAssetSource());
|
|
116
|
-
|
|
117
|
-
await cesdk.actions.run('scene.create', {
|
|
118
|
-
layout: 'DepthStack',
|
|
119
|
-
page: {
|
|
120
|
-
sourceId: 'ly.img.page.presets',
|
|
121
|
-
assetId: 'ly.img.page.presets.instagram.story',
|
|
122
|
-
color: { r: 0, g: 0, b: 0, a: 1 }
|
|
123
|
-
}
|
|
124
|
-
});
|
|
125
|
-
|
|
126
|
-
const engine = cesdk.engine;
|
|
127
|
-
const scene = engine.scene.get();
|
|
128
|
-
const pages = engine.block.findByType('page');
|
|
129
|
-
const page = pages.length > 0 ? pages[0] : scene;
|
|
130
|
-
|
|
131
|
-
// Calculate responsive grid layout based on page dimensions
|
|
132
|
-
const pageWidth = engine.block.getWidth(page);
|
|
133
|
-
const pageHeight = engine.block.getHeight(page);
|
|
134
|
-
const layout = calculateGridLayout(pageWidth, pageHeight, 8);
|
|
135
|
-
const { blockWidth, blockHeight, getPosition } = layout;
|
|
136
|
-
|
|
137
|
-
// Use a sample video URL from demo assets
|
|
138
|
-
const videoUri = 'https://img.ly/static/ubq_video_samples/bbb.mp4';
|
|
139
|
-
|
|
140
|
-
// Create a sample video block to demonstrate trim support checking
|
|
141
|
-
const sampleVideo = await engine.block.addVideo(
|
|
142
|
-
videoUri,
|
|
143
|
-
blockWidth,
|
|
144
|
-
blockHeight
|
|
145
|
-
);
|
|
146
47
|
|
|
147
|
-
|
|
148
|
-
|
|
48
|
+
// Initialize CE.SDK engine in headless mode
|
|
49
|
+
const engine = await CreativeEngine.init({
|
|
50
|
+
baseURL: process.env.IMGLY_LOCAL_ASSETS_URL
|
|
51
|
+
// license: process.env.CESDK_LICENSE, // Optional (trial mode available)
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
try {
|
|
55
|
+
// Create a scene with a page
|
|
56
|
+
const scene = engine.scene.create('DepthStack');
|
|
57
|
+
const page = engine.block.create('page');
|
|
58
|
+
engine.block.setWidth(page, 1280);
|
|
59
|
+
engine.block.setHeight(page, 720);
|
|
60
|
+
engine.block.appendChild(scene, page);
|
|
61
|
+
|
|
62
|
+
// Set page duration to accommodate all demonstrations
|
|
63
|
+
engine.block.setDuration(page, 30);
|
|
64
|
+
|
|
65
|
+
// Sample video URL for demonstrations
|
|
66
|
+
const videoUri = 'https://img.ly/static/ubq_video_samples/bbb.mp4';
|
|
67
|
+
|
|
68
|
+
// Block size for layout
|
|
69
|
+
const blockSize = { width: 320, height: 180 };
|
|
70
|
+
|
|
71
|
+
// Create a video block to demonstrate trim support checking
|
|
72
|
+
const sampleVideo = await engine.block.addVideo(
|
|
73
|
+
videoUri,
|
|
74
|
+
blockSize.width,
|
|
75
|
+
blockSize.height
|
|
76
|
+
);
|
|
149
77
|
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
// eslint-disable-next-line no-console
|
|
153
|
-
console.log('Video fill supports trim:', supportsTrim); // true for video fills
|
|
78
|
+
// Get the video fill - trim operations are applied to the fill, not the block
|
|
79
|
+
const videoFill = engine.block.getFill(sampleVideo);
|
|
154
80
|
|
|
155
|
-
|
|
156
|
-
|
|
81
|
+
// Check if the fill supports trim operations
|
|
82
|
+
const supportsTrim = engine.block.supportsTrim(videoFill);
|
|
83
|
+
console.log('Video fill supports trim:', supportsTrim); // true for video fills
|
|
157
84
|
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
85
|
+
// Load the video resource before accessing trim properties
|
|
86
|
+
// This ensures metadata (duration, frame rate, etc.) is available
|
|
87
|
+
await engine.block.forceLoadAVResource(videoFill);
|
|
161
88
|
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
'fill/video/totalDuration'
|
|
166
|
-
);
|
|
167
|
-
// eslint-disable-next-line no-console
|
|
168
|
-
console.log('Total video duration:', totalDuration, 'seconds');
|
|
169
|
-
|
|
170
|
-
// Pattern #1: Demonstrate Individual Before Combined
|
|
171
|
-
// Create a separate video block for basic trim demonstration
|
|
172
|
-
const basicTrimVideo = await engine.block.addVideo(
|
|
173
|
-
videoUri,
|
|
174
|
-
blockWidth,
|
|
175
|
-
blockHeight
|
|
176
|
-
);
|
|
89
|
+
// Get the total duration of the source video
|
|
90
|
+
const totalDuration = engine.block.getAVResourceTotalDuration(videoFill);
|
|
91
|
+
console.log('Total video duration:', totalDuration, 'seconds');
|
|
177
92
|
|
|
178
|
-
|
|
179
|
-
|
|
93
|
+
// Create a video block for basic trim demonstration
|
|
94
|
+
const basicTrimVideo = await engine.block.addVideo(
|
|
95
|
+
videoUri,
|
|
96
|
+
blockSize.width,
|
|
97
|
+
blockSize.height
|
|
98
|
+
);
|
|
180
99
|
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
// Trim video to start at 2 seconds and play for 5 seconds
|
|
185
|
-
engine.block.setTrimOffset(basicTrimFill, 2.0);
|
|
186
|
-
engine.block.setTrimLength(basicTrimFill, 5.0);
|
|
187
|
-
|
|
188
|
-
// Get current trim values to verify or modify
|
|
189
|
-
const currentOffset = engine.block.getTrimOffset(basicTrimFill);
|
|
190
|
-
const currentLength = engine.block.getTrimLength(basicTrimFill);
|
|
191
|
-
// eslint-disable-next-line no-console
|
|
192
|
-
console.log(
|
|
193
|
-
`Basic trim - Offset: ${currentOffset}s, Length: ${currentLength}s`
|
|
194
|
-
);
|
|
100
|
+
// Get the fill to apply trim operations
|
|
101
|
+
const basicTrimFill = engine.block.getFill(basicTrimVideo);
|
|
195
102
|
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
const durationTrimVideo = await engine.block.addVideo(
|
|
199
|
-
videoUri,
|
|
200
|
-
blockWidth,
|
|
201
|
-
blockHeight
|
|
202
|
-
);
|
|
103
|
+
// Load resource before trimming
|
|
104
|
+
await engine.block.forceLoadAVResource(basicTrimFill);
|
|
203
105
|
|
|
204
|
-
|
|
205
|
-
|
|
106
|
+
// Trim video to start at 2 seconds and play for 5 seconds
|
|
107
|
+
engine.block.setTrimOffset(basicTrimFill, 2.0);
|
|
108
|
+
engine.block.setTrimLength(basicTrimFill, 5.0);
|
|
206
109
|
|
|
207
|
-
|
|
208
|
-
engine.block.setTrimOffset(durationTrimFill, 3.0);
|
|
209
|
-
engine.block.setTrimLength(durationTrimFill, 5.0);
|
|
110
|
+
console.log('Basic trim applied: offset 2s, length 5s');
|
|
210
111
|
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
112
|
+
// Get current trim values to verify or modify
|
|
113
|
+
const currentOffset = engine.block.getTrimOffset(basicTrimFill);
|
|
114
|
+
const currentLength = engine.block.getTrimLength(basicTrimFill);
|
|
115
|
+
console.log(
|
|
116
|
+
`Current trim values - Offset: ${currentOffset}s, Length: ${currentLength}s`
|
|
117
|
+
);
|
|
214
118
|
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
);
|
|
119
|
+
// Get the total duration of source media to validate trim values
|
|
120
|
+
const sourceDuration = engine.block.getAVResourceTotalDuration(basicTrimFill);
|
|
121
|
+
console.log('Source media duration:', sourceDuration, 'seconds');
|
|
219
122
|
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
blockWidth,
|
|
224
|
-
blockHeight
|
|
225
|
-
);
|
|
123
|
+
// Validate trim doesn't exceed source length
|
|
124
|
+
const maxTrimLength = sourceDuration - currentOffset;
|
|
125
|
+
console.log('Maximum trim length from current offset:', maxTrimLength, 's');
|
|
226
126
|
|
|
227
|
-
|
|
228
|
-
|
|
127
|
+
// Create a video block demonstrating trim + duration coordination
|
|
128
|
+
const durationTrimVideo = await engine.block.addVideo(
|
|
129
|
+
videoUri,
|
|
130
|
+
blockSize.width,
|
|
131
|
+
blockSize.height
|
|
132
|
+
);
|
|
229
133
|
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
engine.block.setTrimLength(loopingTrimFill, 3.0);
|
|
134
|
+
const durationTrimFill = engine.block.getFill(durationTrimVideo);
|
|
135
|
+
await engine.block.forceLoadAVResource(durationTrimFill);
|
|
233
136
|
|
|
234
|
-
|
|
235
|
-
|
|
137
|
+
// Set trim: play portion from 3s to 8s (5 seconds of content)
|
|
138
|
+
engine.block.setTrimOffset(durationTrimFill, 3.0);
|
|
139
|
+
engine.block.setTrimLength(durationTrimFill, 5.0);
|
|
236
140
|
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
console.log('Looping enabled:', isLooping);
|
|
141
|
+
// Set block duration: how long this block appears in the timeline
|
|
142
|
+
// When duration equals trim length, the entire trimmed portion plays once
|
|
143
|
+
engine.block.setDuration(durationTrimVideo, 5.0);
|
|
241
144
|
|
|
242
|
-
|
|
243
|
-
engine.block.setDuration(loopingTrimVideo, 9.0);
|
|
145
|
+
console.log('Trim+Duration: Block will play trimmed 5s exactly once');
|
|
244
146
|
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
147
|
+
// Create a video block with trim + looping
|
|
148
|
+
const loopingTrimVideo = await engine.block.addVideo(
|
|
149
|
+
videoUri,
|
|
150
|
+
blockSize.width,
|
|
151
|
+
blockSize.height
|
|
152
|
+
);
|
|
249
153
|
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
);
|
|
154
|
+
const loopingTrimFill = engine.block.getFill(loopingTrimVideo);
|
|
155
|
+
await engine.block.forceLoadAVResource(loopingTrimFill);
|
|
156
|
+
|
|
157
|
+
// Trim to a short 3-second segment
|
|
158
|
+
engine.block.setTrimOffset(loopingTrimFill, 1.0);
|
|
159
|
+
engine.block.setTrimLength(loopingTrimFill, 3.0);
|
|
257
160
|
|
|
258
|
-
|
|
259
|
-
|
|
161
|
+
// Enable looping so the 3-second segment repeats
|
|
162
|
+
engine.block.setLooping(loopingTrimFill, true);
|
|
260
163
|
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
164
|
+
// Verify looping is enabled
|
|
165
|
+
const isLooping = engine.block.isLooping(loopingTrimFill);
|
|
166
|
+
console.log('Looping enabled:', isLooping);
|
|
264
167
|
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
const startFrame = 60;
|
|
268
|
-
const trimOffsetSeconds = startFrame / frameRate;
|
|
168
|
+
// Set duration longer than trim length - the trim will loop to fill it
|
|
169
|
+
engine.block.setDuration(loopingTrimVideo, 9.0);
|
|
269
170
|
|
|
270
|
-
|
|
271
|
-
const trimFrames = 150;
|
|
272
|
-
const trimLengthSeconds = trimFrames / frameRate;
|
|
171
|
+
console.log('Looping trim: 3s segment will loop 3 times to fill 9s duration');
|
|
273
172
|
|
|
274
|
-
|
|
275
|
-
|
|
173
|
+
// Create a video block for frame-accurate trimming
|
|
174
|
+
const frameAccurateTrimVideo = await engine.block.addVideo(
|
|
175
|
+
videoUri,
|
|
176
|
+
blockSize.width,
|
|
177
|
+
blockSize.height
|
|
178
|
+
);
|
|
179
|
+
|
|
180
|
+
const frameFill = engine.block.getFill(frameAccurateTrimVideo);
|
|
181
|
+
await engine.block.forceLoadAVResource(frameFill);
|
|
182
|
+
|
|
183
|
+
// For frame-accurate trimming, assume a common frame rate (e.g., 30fps)
|
|
184
|
+
// In production, you may know the frame rate from your video metadata
|
|
185
|
+
const frameRate = 30;
|
|
186
|
+
|
|
187
|
+
// Calculate trim offset based on specific frame number
|
|
188
|
+
// Example: Start at frame 60 for a 30fps video = 2.0 seconds
|
|
189
|
+
const startFrame = 60;
|
|
190
|
+
const trimOffsetSeconds = startFrame / frameRate;
|
|
191
|
+
|
|
192
|
+
// Trim for exactly 150 frames = 5.0 seconds at 30fps
|
|
193
|
+
const trimFrames = 150;
|
|
194
|
+
const trimLengthSeconds = trimFrames / frameRate;
|
|
195
|
+
|
|
196
|
+
engine.block.setTrimOffset(frameFill, trimOffsetSeconds);
|
|
197
|
+
engine.block.setTrimLength(frameFill, trimLengthSeconds);
|
|
198
|
+
|
|
199
|
+
console.log(
|
|
200
|
+
`Frame-accurate trim - Frame rate: ${frameRate}fps, Start: ${startFrame}, Duration: ${trimFrames} frames`
|
|
201
|
+
);
|
|
276
202
|
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
203
|
+
// Batch process multiple video clips with consistent trimming
|
|
204
|
+
const batchVideoUris = [
|
|
205
|
+
'https://img.ly/static/ubq_video_samples/bbb.mp4',
|
|
206
|
+
'https://img.ly/static/ubq_video_samples/bbb.mp4',
|
|
207
|
+
'https://img.ly/static/ubq_video_samples/bbb.mp4'
|
|
208
|
+
];
|
|
209
|
+
|
|
210
|
+
const batchVideos = [];
|
|
211
|
+
for (const uri of batchVideoUris) {
|
|
212
|
+
const batchVideo = await engine.block.addVideo(
|
|
213
|
+
uri,
|
|
214
|
+
blockSize.width,
|
|
215
|
+
blockSize.height
|
|
280
216
|
);
|
|
217
|
+
batchVideos.push(batchVideo);
|
|
218
|
+
|
|
219
|
+
// Get the fill for trim operations
|
|
220
|
+
const batchFill = engine.block.getFill(batchVideo);
|
|
221
|
+
|
|
222
|
+
// Load resource before trimming
|
|
223
|
+
await engine.block.forceLoadAVResource(batchFill);
|
|
281
224
|
|
|
282
|
-
//
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
];
|
|
289
|
-
|
|
290
|
-
const batchVideos = [];
|
|
291
|
-
for (let i = 0; i < batchVideoUris.length; i++) {
|
|
292
|
-
const batchVideo = await engine.block.addVideo(
|
|
293
|
-
batchVideoUris[i],
|
|
294
|
-
blockWidth,
|
|
295
|
-
blockHeight
|
|
296
|
-
);
|
|
297
|
-
batchVideos.push(batchVideo);
|
|
298
|
-
|
|
299
|
-
// Get the fill for trim operations
|
|
300
|
-
const batchFill = engine.block.getFill(batchVideo);
|
|
301
|
-
|
|
302
|
-
// Load resource before trimming
|
|
303
|
-
await engine.block.forceLoadAVResource(batchFill);
|
|
304
|
-
|
|
305
|
-
// Apply consistent trim: first 4 seconds of each video
|
|
306
|
-
engine.block.setTrimOffset(batchFill, 0.0);
|
|
307
|
-
engine.block.setTrimLength(batchFill, 4.0);
|
|
308
|
-
|
|
309
|
-
// Set consistent duration
|
|
310
|
-
engine.block.setDuration(batchVideo, 4.0);
|
|
311
|
-
}
|
|
312
|
-
|
|
313
|
-
// eslint-disable-next-line no-console
|
|
314
|
-
console.log('Batch trim - Applied consistent 4s trim to 3 video blocks');
|
|
315
|
-
|
|
316
|
-
// ===== Position all blocks in grid layout =====
|
|
317
|
-
const blocks = [
|
|
318
|
-
sampleVideo, // Position 0
|
|
319
|
-
basicTrimVideo, // Position 1
|
|
320
|
-
durationTrimVideo, // Position 2
|
|
321
|
-
loopingTrimVideo, // Position 3
|
|
322
|
-
frameAccurateTrimVideo, // Position 4
|
|
323
|
-
...batchVideos // Positions 5-7
|
|
324
|
-
];
|
|
325
|
-
|
|
326
|
-
blocks.forEach((block, index) => {
|
|
327
|
-
const pos = getPosition(index);
|
|
328
|
-
engine.block.setPositionX(block, pos.x);
|
|
329
|
-
engine.block.setPositionY(block, pos.y);
|
|
330
|
-
});
|
|
331
|
-
|
|
332
|
-
// Start playback automatically when the example loads
|
|
333
|
-
try {
|
|
334
|
-
engine.block.setPlaying(page, true);
|
|
335
|
-
// eslint-disable-next-line no-console
|
|
336
|
-
console.log(
|
|
337
|
-
'Video trim guide initialized. Playback started automatically. Use timeline controls to adjust trim handles.'
|
|
338
|
-
);
|
|
339
|
-
} catch (error) {
|
|
340
|
-
// eslint-disable-next-line no-console
|
|
341
|
-
console.log(
|
|
342
|
-
'Video trim guide initialized. Click play button to start playback.'
|
|
343
|
-
);
|
|
344
|
-
}
|
|
225
|
+
// Apply consistent trim: first 4 seconds of each video
|
|
226
|
+
engine.block.setTrimOffset(batchFill, 0.0);
|
|
227
|
+
engine.block.setTrimLength(batchFill, 4.0);
|
|
228
|
+
|
|
229
|
+
// Set consistent duration
|
|
230
|
+
engine.block.setDuration(batchVideo, 4.0);
|
|
345
231
|
}
|
|
346
|
-
}
|
|
347
232
|
|
|
348
|
-
|
|
233
|
+
console.log(
|
|
234
|
+
`Batch trim: Applied consistent 4s trim to ${batchVideos.length} videos`
|
|
235
|
+
);
|
|
236
|
+
|
|
237
|
+
// ===== Position all blocks in grid layout =====
|
|
238
|
+
const spacing = 20;
|
|
239
|
+
const margin = 40;
|
|
240
|
+
const cols = 3;
|
|
241
|
+
|
|
242
|
+
const getPosition = (index: number) => ({
|
|
243
|
+
x: margin + (index % cols) * (blockSize.width + spacing),
|
|
244
|
+
y: margin + Math.floor(index / cols) * (blockSize.height + spacing)
|
|
245
|
+
});
|
|
246
|
+
|
|
247
|
+
const blocks = [
|
|
248
|
+
sampleVideo,
|
|
249
|
+
basicTrimVideo,
|
|
250
|
+
durationTrimVideo,
|
|
251
|
+
loopingTrimVideo,
|
|
252
|
+
frameAccurateTrimVideo,
|
|
253
|
+
...batchVideos
|
|
254
|
+
];
|
|
255
|
+
|
|
256
|
+
blocks.forEach((block, index) => {
|
|
257
|
+
const pos = getPosition(index);
|
|
258
|
+
engine.block.setPositionX(block, pos.x);
|
|
259
|
+
engine.block.setPositionY(block, pos.y);
|
|
260
|
+
});
|
|
261
|
+
|
|
262
|
+
// Save the scene as a .scene file for later use or rendering
|
|
263
|
+
// This preserves all trim settings and can be loaded in any CE.SDK environment
|
|
264
|
+
console.log('Saving scene...');
|
|
265
|
+
|
|
266
|
+
const sceneString = await engine.scene.saveToString();
|
|
267
|
+
|
|
268
|
+
// Ensure output directory exists
|
|
269
|
+
if (!existsSync('output')) {
|
|
270
|
+
mkdirSync('output');
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
// Save to file
|
|
274
|
+
writeFileSync('output/trimmed-video.scene', sceneString);
|
|
275
|
+
console.log('Exported to output/trimmed-video.scene');
|
|
276
|
+
|
|
277
|
+
console.log('');
|
|
278
|
+
console.log('Video trim guide completed successfully.');
|
|
279
|
+
console.log('Scene saved with:');
|
|
280
|
+
console.log(' - 8 video blocks with various trim configurations');
|
|
281
|
+
console.log(' - Basic trim, duration coordination, looping, and batch trim');
|
|
282
|
+
console.log(' - Ready for rendering with CE.SDK Renderer');
|
|
283
|
+
} finally {
|
|
284
|
+
engine.dispose();
|
|
285
|
+
}
|
|
349
286
|
```
|
|
350
287
|
|
|
351
|
-
This guide covers how to
|
|
288
|
+
This guide covers how to trim videos programmatically using the Engine API in a headless Node.js environment.
|
|
352
289
|
|
|
353
290
|
## Understanding Trim Concepts
|
|
354
291
|
|
|
@@ -369,7 +306,7 @@ This trimming is completely non-destructive—the source video file remains unch
|
|
|
369
306
|
|
|
370
307
|
Block-level timing is separate from trimming and controls when and how long a block exists in the composition. `setTimeOffset` determines when the block becomes active in the composition (useful for track-based layouts). `setDuration` controls how long the block appears in the composition.
|
|
371
308
|
|
|
372
|
-
The
|
|
309
|
+
The *trim* controls what plays from the source media, while the *duration* controls how long that playback appears in the composition. If the duration exceeds the trim length and if looping is disabled, the trimmed portion will play once and then hold the last frame for the remaining duration.
|
|
373
310
|
|
|
374
311
|
### Common Use Cases
|
|
375
312
|
|
|
@@ -381,162 +318,148 @@ Trimming enables many video editing workflows:
|
|
|
381
318
|
- **Create loops** - Trim to a specific length and enable loop mode for seamless repeating content
|
|
382
319
|
- **Uniform compositions** - Batch trim multiple clips to consistent lengths
|
|
383
320
|
|
|
384
|
-
##
|
|
385
|
-
|
|
386
|
-
### Accessing Trim Controls
|
|
387
|
-
|
|
388
|
-
When you select a video block in the timeline, CE.SDK reveals trim handles at the edges of the clip. These visual controls appear as draggable handles on the left and right sides of the video block in the timeline panel.
|
|
389
|
-
|
|
390
|
-
The trimmed portion of your video is visually distinguished from the untrimmed regions on either side that represent portions of the source media that won't play due to trim settings. This visual feedback makes it immediately clear which part of your video will be included in the final composition.
|
|
391
|
-
|
|
392
|
-
### Using Trim Handles
|
|
393
|
-
|
|
394
|
-
We adjust trimming by dragging the handles. The left handle controls the trim offset—dragging it right increases the offset, skipping more of the beginning. Dragging left decreases the offset, including more from the start of the video.
|
|
395
|
-
|
|
396
|
-
The right handle adjusts the trim length by changing where the video stops playing. Dragging left shortens the trim length, ending playback earlier. Dragging right extends it, playing more of the source media.
|
|
397
|
-
|
|
398
|
-
For frame-accurate control, many CE.SDK interfaces provide numeric input fields where you can type exact time values in seconds. This precision is essential when you need to trim to specific frames or match exact durations.
|
|
399
|
-
|
|
400
|
-
The icon on the trim handle turns into an outward-pointing arrow.
|
|
401
|
-
|
|
402
|
-
### Preview During Trimming
|
|
403
|
-
|
|
404
|
-
Scrubbing the playhead through your trimmed content shows exactly what will play. This immediate feedback loop makes it easy to find the perfect trim points visually.
|
|
321
|
+
## Programmatic Video Trimming
|
|
405
322
|
|
|
406
|
-
|
|
323
|
+
### Initialize CE.SDK
|
|
407
324
|
|
|
408
|
-
|
|
325
|
+
For headless video processing, we initialize CE.SDK's Node.js engine. This provides full API access to the trimming system without browser dependencies, making it ideal for server-side automation and batch processing.
|
|
409
326
|
|
|
410
|
-
|
|
327
|
+
```typescript highlight-setup
|
|
328
|
+
// Initialize CE.SDK engine in headless mode
|
|
329
|
+
const engine = await CreativeEngine.init({
|
|
330
|
+
baseURL: process.env.IMGLY_LOCAL_ASSETS_URL
|
|
331
|
+
// license: process.env.CESDK_LICENSE, // Optional (trial mode available)
|
|
332
|
+
});
|
|
333
|
+
```
|
|
411
334
|
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
## Programmatic Video Trimming
|
|
335
|
+
The headless engine gives you complete control over video trimming operations, perfect for automated workflows, background processing, and server-side video preparation.
|
|
415
336
|
|
|
416
337
|
### Loading Video Resources
|
|
417
338
|
|
|
418
|
-
Before accessing trim properties or setting trim values, we must load the video resource metadata using `forceLoadAVResource`. This
|
|
339
|
+
Before accessing trim properties or setting trim values, we must load the video resource metadata using `forceLoadAVResource`. This step ensures CE.SDK has information about the video's duration and other properties needed for accurate trimming.
|
|
419
340
|
|
|
420
341
|
```typescript highlight-load-video-resource
|
|
421
|
-
//
|
|
422
|
-
// This ensures metadata (duration, frame rate, etc.) is available
|
|
423
|
-
await engine.block.forceLoadAVResource(videoFill);
|
|
424
|
-
|
|
425
|
-
//
|
|
426
|
-
const totalDuration = engine.block.
|
|
427
|
-
|
|
428
|
-
'fill/video/totalDuration'
|
|
429
|
-
);
|
|
430
|
-
// eslint-disable-next-line no-console
|
|
431
|
-
console.log('Total video duration:', totalDuration, 'seconds');
|
|
342
|
+
// Load the video resource before accessing trim properties
|
|
343
|
+
// This ensures metadata (duration, frame rate, etc.) is available
|
|
344
|
+
await engine.block.forceLoadAVResource(videoFill);
|
|
345
|
+
|
|
346
|
+
// Get the total duration of the source video
|
|
347
|
+
const totalDuration = engine.block.getAVResourceTotalDuration(videoFill);
|
|
348
|
+
console.log('Total video duration:', totalDuration, 'seconds');
|
|
432
349
|
```
|
|
433
350
|
|
|
434
|
-
Skipping this step is a common source of errors. Without loading the resource first, trim operations may fail
|
|
351
|
+
Skipping this step is a common source of errors. Without loading the resource first, trim operations may fail or produce unexpected results. Always await `forceLoadAVResource` before calling any trim methods.
|
|
435
352
|
|
|
436
|
-
Once loaded, we can access metadata like `totalDuration`
|
|
353
|
+
Once loaded, we can access metadata like `totalDuration` from the video fill. This information helps us calculate valid trim ranges and ensures we don't try to trim beyond the available media.
|
|
437
354
|
|
|
438
355
|
### Checking Trim Support
|
|
439
356
|
|
|
440
|
-
Before applying trim operations, we verify that a block supports trimming. While video
|
|
357
|
+
Before applying trim operations, we verify that a block supports trimming. While video fills typically support trimming, other block types like pages and scenes do not.
|
|
441
358
|
|
|
442
359
|
```typescript highlight-check-trim-support
|
|
443
|
-
// Create a
|
|
444
|
-
const sampleVideo = await engine.block.addVideo(
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
);
|
|
449
|
-
|
|
450
|
-
// Get the video fill - trim operations are applied to the fill, not the block
|
|
451
|
-
const videoFill = engine.block.getFill(sampleVideo);
|
|
360
|
+
// Create a video block to demonstrate trim support checking
|
|
361
|
+
const sampleVideo = await engine.block.addVideo(
|
|
362
|
+
videoUri,
|
|
363
|
+
blockSize.width,
|
|
364
|
+
blockSize.height
|
|
365
|
+
);
|
|
452
366
|
|
|
453
|
-
//
|
|
454
|
-
const
|
|
455
|
-
// eslint-disable-next-line no-console
|
|
456
|
-
console.log('Video fill supports trim:', supportsTrim); // true for video fills
|
|
367
|
+
// Get the video fill - trim operations are applied to the fill, not the block
|
|
368
|
+
const videoFill = engine.block.getFill(sampleVideo);
|
|
457
369
|
|
|
458
|
-
//
|
|
459
|
-
engine.block.
|
|
370
|
+
// Check if the fill supports trim operations
|
|
371
|
+
const supportsTrim = engine.block.supportsTrim(videoFill);
|
|
372
|
+
console.log('Video fill supports trim:', supportsTrim); // true for video fills
|
|
460
373
|
```
|
|
461
374
|
|
|
462
|
-
Checking support prevents runtime errors and allows you to build robust
|
|
375
|
+
Checking support prevents runtime errors and allows you to build robust applications that only apply trim operations to compatible blocks. Graphic blocks with video fills also support trimming, not just top-level video blocks.
|
|
463
376
|
|
|
464
377
|
### Trimming Video
|
|
465
378
|
|
|
466
379
|
Once we've confirmed trim support and loaded the resource, we can apply trimming. Here we create a video block and trim it to start 2 seconds into the source media and play for 5 seconds.
|
|
467
380
|
|
|
468
381
|
```typescript highlight-basic-video-trim
|
|
469
|
-
//
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
382
|
+
// Create a video block for basic trim demonstration
|
|
383
|
+
const basicTrimVideo = await engine.block.addVideo(
|
|
384
|
+
videoUri,
|
|
385
|
+
blockSize.width,
|
|
386
|
+
blockSize.height
|
|
387
|
+
);
|
|
388
|
+
|
|
389
|
+
// Get the fill to apply trim operations
|
|
390
|
+
const basicTrimFill = engine.block.getFill(basicTrimVideo);
|
|
476
391
|
|
|
477
|
-
//
|
|
478
|
-
|
|
392
|
+
// Load resource before trimming
|
|
393
|
+
await engine.block.forceLoadAVResource(basicTrimFill);
|
|
479
394
|
|
|
480
|
-
//
|
|
481
|
-
|
|
395
|
+
// Trim video to start at 2 seconds and play for 5 seconds
|
|
396
|
+
engine.block.setTrimOffset(basicTrimFill, 2.0);
|
|
397
|
+
engine.block.setTrimLength(basicTrimFill, 5.0);
|
|
482
398
|
|
|
483
|
-
|
|
484
|
-
engine.block.setTrimOffset(basicTrimFill, 2.0);
|
|
485
|
-
engine.block.setTrimLength(basicTrimFill, 5.0);
|
|
399
|
+
console.log('Basic trim applied: offset 2s, length 5s');
|
|
486
400
|
```
|
|
487
401
|
|
|
488
402
|
The trim offset of 2.0 skips the first 2 seconds of the video. The trim length of 5.0 means exactly 5 seconds of video will play, starting from that offset point. So this video plays from the 2-second mark to the 7-second mark of the original file.
|
|
489
403
|
|
|
490
404
|
### Getting Current Trim Values
|
|
491
405
|
|
|
492
|
-
We can retrieve the current trim settings to verify values,
|
|
406
|
+
We can retrieve the current trim settings to verify values, make relative adjustments, or log processing information.
|
|
493
407
|
|
|
494
408
|
```typescript highlight-get-trim-values
|
|
495
409
|
// Get current trim values to verify or modify
|
|
496
410
|
const currentOffset = engine.block.getTrimOffset(basicTrimFill);
|
|
497
411
|
const currentLength = engine.block.getTrimLength(basicTrimFill);
|
|
498
|
-
// eslint-disable-next-line no-console
|
|
499
412
|
console.log(
|
|
500
|
-
`
|
|
413
|
+
`Current trim values - Offset: ${currentOffset}s, Length: ${currentLength}s`
|
|
501
414
|
);
|
|
502
415
|
```
|
|
503
416
|
|
|
504
|
-
These getter methods return the current trim offset and length in seconds. Use them to
|
|
417
|
+
These getter methods return the current trim offset and length in seconds. Use them to validate settings before export or to calculate remaining media duration.
|
|
418
|
+
|
|
419
|
+
### Getting Source Media Duration
|
|
420
|
+
|
|
421
|
+
Use `getAVResourceTotalDuration()` to determine the total duration of the source media file. This helps validate that trim values don't exceed available media.
|
|
422
|
+
|
|
423
|
+
```typescript highlight-get-source-duration
|
|
424
|
+
// Get the total duration of source media to validate trim values
|
|
425
|
+
const sourceDuration = engine.block.getAVResourceTotalDuration(basicTrimFill);
|
|
426
|
+
console.log('Source media duration:', sourceDuration, 'seconds');
|
|
427
|
+
|
|
428
|
+
// Validate trim doesn't exceed source length
|
|
429
|
+
const maxTrimLength = sourceDuration - currentOffset;
|
|
430
|
+
console.log('Maximum trim length from current offset:', maxTrimLength, 's');
|
|
431
|
+
```
|
|
432
|
+
|
|
433
|
+
Always check the source duration when processing videos of unknown length. This prevents setting trim offsets beyond the video's end and ensures your trim length doesn't exceed available content.
|
|
505
434
|
|
|
506
435
|
## Additional Trimming Techniques
|
|
507
436
|
|
|
508
437
|
### Trimming with Block Duration
|
|
509
438
|
|
|
510
|
-
|
|
439
|
+
Trim length and block duration interact to determine playback behavior. When block duration equals trim length, the entire trimmed portion plays exactly once.
|
|
511
440
|
|
|
512
441
|
```typescript highlight-trim-with-duration
|
|
513
|
-
//
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
);
|
|
442
|
+
// Create a video block demonstrating trim + duration coordination
|
|
443
|
+
const durationTrimVideo = await engine.block.addVideo(
|
|
444
|
+
videoUri,
|
|
445
|
+
blockSize.width,
|
|
446
|
+
blockSize.height
|
|
447
|
+
);
|
|
520
448
|
|
|
521
|
-
const durationTrimFill = engine.block.getFill(durationTrimVideo);
|
|
522
|
-
await engine.block.forceLoadAVResource(durationTrimFill);
|
|
449
|
+
const durationTrimFill = engine.block.getFill(durationTrimVideo);
|
|
450
|
+
await engine.block.forceLoadAVResource(durationTrimFill);
|
|
523
451
|
|
|
524
|
-
// Set trim: play portion from 3s to 8s (5 seconds of content)
|
|
525
|
-
engine.block.setTrimOffset(durationTrimFill, 3.0);
|
|
526
|
-
engine.block.setTrimLength(durationTrimFill, 5.0);
|
|
452
|
+
// Set trim: play portion from 3s to 8s (5 seconds of content)
|
|
453
|
+
engine.block.setTrimOffset(durationTrimFill, 3.0);
|
|
454
|
+
engine.block.setTrimLength(durationTrimFill, 5.0);
|
|
527
455
|
|
|
528
|
-
// Set block duration: how long this block appears in the timeline
|
|
529
|
-
// When duration equals trim length, the entire trimmed portion plays once
|
|
530
|
-
engine.block.setDuration(durationTrimVideo, 5.0);
|
|
456
|
+
// Set block duration: how long this block appears in the timeline
|
|
457
|
+
// When duration equals trim length, the entire trimmed portion plays once
|
|
458
|
+
engine.block.setDuration(durationTrimVideo, 5.0);
|
|
531
459
|
|
|
532
|
-
|
|
533
|
-
console.log(
|
|
534
|
-
'Trim+Duration - Block will play trimmed 5s exactly once in timeline'
|
|
535
|
-
);
|
|
460
|
+
console.log('Trim+Duration: Block will play trimmed 5s exactly once');
|
|
536
461
|
```
|
|
537
462
|
|
|
538
|
-
In this example, we trim the video to a 5-second segment (from 3s to 8s of the source) and set the block duration to exactly 5 seconds. This means the entire trimmed portion plays once, then stops. The block duration matches the trim length, so there's no looping or holding on the last frame.
|
|
539
|
-
|
|
540
463
|
If the block duration is less than the trim length, only part of the trimmed segment will play. If duration exceeds trim length without looping enabled, the video plays the trimmed portion once and holds on the last frame for the remaining time.
|
|
541
464
|
|
|
542
465
|
### Trimming with Looping
|
|
@@ -544,124 +467,143 @@ If the block duration is less than the trim length, only part of the trimmed seg
|
|
|
544
467
|
Looping allows a trimmed video segment to repeat seamlessly. We enable looping and set a block duration longer than the trim length to create repeating playback.
|
|
545
468
|
|
|
546
469
|
```typescript highlight-trim-with-looping
|
|
547
|
-
// Create a video block with trim + looping
|
|
548
|
-
const loopingTrimVideo = await engine.block.addVideo(
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
);
|
|
470
|
+
// Create a video block with trim + looping
|
|
471
|
+
const loopingTrimVideo = await engine.block.addVideo(
|
|
472
|
+
videoUri,
|
|
473
|
+
blockSize.width,
|
|
474
|
+
blockSize.height
|
|
475
|
+
);
|
|
553
476
|
|
|
554
|
-
const loopingTrimFill = engine.block.getFill(loopingTrimVideo);
|
|
555
|
-
await engine.block.forceLoadAVResource(loopingTrimFill);
|
|
477
|
+
const loopingTrimFill = engine.block.getFill(loopingTrimVideo);
|
|
478
|
+
await engine.block.forceLoadAVResource(loopingTrimFill);
|
|
556
479
|
|
|
557
|
-
// Trim to a short 3-second segment
|
|
558
|
-
engine.block.setTrimOffset(loopingTrimFill, 1.0);
|
|
559
|
-
engine.block.setTrimLength(loopingTrimFill, 3.0);
|
|
480
|
+
// Trim to a short 3-second segment
|
|
481
|
+
engine.block.setTrimOffset(loopingTrimFill, 1.0);
|
|
482
|
+
engine.block.setTrimLength(loopingTrimFill, 3.0);
|
|
560
483
|
|
|
561
|
-
// Enable looping so the 3-second segment repeats
|
|
562
|
-
engine.block.setLooping(loopingTrimFill, true);
|
|
484
|
+
// Enable looping so the 3-second segment repeats
|
|
485
|
+
engine.block.setLooping(loopingTrimFill, true);
|
|
563
486
|
|
|
564
|
-
// Verify looping is enabled
|
|
565
|
-
const isLooping = engine.block.isLooping(loopingTrimFill);
|
|
566
|
-
|
|
567
|
-
console.log('Looping enabled:', isLooping);
|
|
487
|
+
// Verify looping is enabled
|
|
488
|
+
const isLooping = engine.block.isLooping(loopingTrimFill);
|
|
489
|
+
console.log('Looping enabled:', isLooping);
|
|
568
490
|
|
|
569
|
-
// Set duration longer than trim length - the trim will loop to fill it
|
|
570
|
-
engine.block.setDuration(loopingTrimVideo, 9.0);
|
|
491
|
+
// Set duration longer than trim length - the trim will loop to fill it
|
|
492
|
+
engine.block.setDuration(loopingTrimVideo, 9.0);
|
|
571
493
|
|
|
572
|
-
|
|
573
|
-
console.log('Looping trim - 3s segment will loop 3 times to fill 9s duration');
|
|
494
|
+
console.log('Looping trim: 3s segment will loop 3 times to fill 9s duration');
|
|
574
495
|
```
|
|
575
496
|
|
|
576
|
-
|
|
497
|
+
The 3-second trimmed segment loops 3 times to fill the 9-second duration. This technique is useful for creating background loops, repeated motion graphics, or extending short clips.
|
|
577
498
|
|
|
578
|
-
When looping is enabled, CE.SDK automatically restarts playback from the trim offset when it reaches the end of the trim length.
|
|
499
|
+
When looping is enabled, CE.SDK automatically restarts playback from the trim offset when it reaches the end of the trim length. Use `isLooping()` to check the current looping state.
|
|
579
500
|
|
|
580
501
|
### Frame-Accurate Trimming
|
|
581
502
|
|
|
582
|
-
For precise editing, we
|
|
503
|
+
For precise editing, we can trim to specific frame boundaries rather than arbitrary time values. Using the video's frame rate, we calculate exact frame-based trim points.
|
|
583
504
|
|
|
584
505
|
```typescript highlight-frame-accurate-trim
|
|
585
|
-
//
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
);
|
|
506
|
+
// Create a video block for frame-accurate trimming
|
|
507
|
+
const frameAccurateTrimVideo = await engine.block.addVideo(
|
|
508
|
+
videoUri,
|
|
509
|
+
blockSize.width,
|
|
510
|
+
blockSize.height
|
|
511
|
+
);
|
|
592
512
|
|
|
593
|
-
const frameFill = engine.block.getFill(frameAccurateTrimVideo);
|
|
594
|
-
await engine.block.forceLoadAVResource(frameFill);
|
|
513
|
+
const frameFill = engine.block.getFill(frameAccurateTrimVideo);
|
|
514
|
+
await engine.block.forceLoadAVResource(frameFill);
|
|
595
515
|
|
|
596
|
-
//
|
|
597
|
-
//
|
|
598
|
-
const frameRate = 30;
|
|
516
|
+
// For frame-accurate trimming, assume a common frame rate (e.g., 30fps)
|
|
517
|
+
// In production, you may know the frame rate from your video metadata
|
|
518
|
+
const frameRate = 30;
|
|
599
519
|
|
|
600
|
-
// Calculate trim offset based on specific frame number
|
|
601
|
-
// Example: Start at frame 60 for a 30fps video = 2.0 seconds
|
|
602
|
-
const startFrame = 60;
|
|
603
|
-
const trimOffsetSeconds = startFrame / frameRate;
|
|
520
|
+
// Calculate trim offset based on specific frame number
|
|
521
|
+
// Example: Start at frame 60 for a 30fps video = 2.0 seconds
|
|
522
|
+
const startFrame = 60;
|
|
523
|
+
const trimOffsetSeconds = startFrame / frameRate;
|
|
604
524
|
|
|
605
|
-
// Trim for exactly 150 frames = 5.0 seconds at 30fps
|
|
606
|
-
const trimFrames = 150;
|
|
607
|
-
const trimLengthSeconds = trimFrames / frameRate;
|
|
525
|
+
// Trim for exactly 150 frames = 5.0 seconds at 30fps
|
|
526
|
+
const trimFrames = 150;
|
|
527
|
+
const trimLengthSeconds = trimFrames / frameRate;
|
|
608
528
|
|
|
609
|
-
engine.block.setTrimOffset(frameFill, trimOffsetSeconds);
|
|
610
|
-
engine.block.setTrimLength(frameFill, trimLengthSeconds);
|
|
529
|
+
engine.block.setTrimOffset(frameFill, trimOffsetSeconds);
|
|
530
|
+
engine.block.setTrimLength(frameFill, trimLengthSeconds);
|
|
611
531
|
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
);
|
|
532
|
+
console.log(
|
|
533
|
+
`Frame-accurate trim - Frame rate: ${frameRate}fps, Start: ${startFrame}, Duration: ${trimFrames} frames`
|
|
534
|
+
);
|
|
616
535
|
```
|
|
617
536
|
|
|
618
|
-
|
|
537
|
+
Convert frame numbers to time offsets by dividing by the frame rate. Starting at frame 60 with a 30fps video gives exactly 2.0 seconds. Trimming for 150 frames provides exactly 5.0 seconds of playback.
|
|
619
538
|
|
|
620
|
-
This technique ensures frame-accurate edits
|
|
539
|
+
This technique ensures frame-accurate edits for professional video processing workflows. Keep in mind that codec compression may affect true frame accuracy—test with your target codecs to verify precision.
|
|
621
540
|
|
|
622
541
|
### Batch Processing Multiple Videos
|
|
623
542
|
|
|
624
|
-
When working with multiple video clips that need consistent trimming,
|
|
543
|
+
When working with multiple video clips that need consistent trimming, iterate through collections and apply the same trim settings programmatically.
|
|
625
544
|
|
|
626
545
|
```typescript highlight-batch-trim-videos
|
|
627
|
-
//
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
const
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
batchVideos.push(batchVideo);
|
|
546
|
+
// Batch process multiple video clips with consistent trimming
|
|
547
|
+
const batchVideoUris = [
|
|
548
|
+
'https://img.ly/static/ubq_video_samples/bbb.mp4',
|
|
549
|
+
'https://img.ly/static/ubq_video_samples/bbb.mp4',
|
|
550
|
+
'https://img.ly/static/ubq_video_samples/bbb.mp4'
|
|
551
|
+
];
|
|
552
|
+
|
|
553
|
+
const batchVideos = [];
|
|
554
|
+
for (const uri of batchVideoUris) {
|
|
555
|
+
const batchVideo = await engine.block.addVideo(
|
|
556
|
+
uri,
|
|
557
|
+
blockSize.width,
|
|
558
|
+
blockSize.height
|
|
559
|
+
);
|
|
560
|
+
batchVideos.push(batchVideo);
|
|
643
561
|
|
|
644
|
-
|
|
645
|
-
|
|
562
|
+
// Get the fill for trim operations
|
|
563
|
+
const batchFill = engine.block.getFill(batchVideo);
|
|
646
564
|
|
|
647
|
-
|
|
648
|
-
|
|
565
|
+
// Load resource before trimming
|
|
566
|
+
await engine.block.forceLoadAVResource(batchFill);
|
|
649
567
|
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
568
|
+
// Apply consistent trim: first 4 seconds of each video
|
|
569
|
+
engine.block.setTrimOffset(batchFill, 0.0);
|
|
570
|
+
engine.block.setTrimLength(batchFill, 4.0);
|
|
653
571
|
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
}
|
|
572
|
+
// Set consistent duration
|
|
573
|
+
engine.block.setDuration(batchVideo, 4.0);
|
|
574
|
+
}
|
|
657
575
|
|
|
658
|
-
|
|
659
|
-
|
|
576
|
+
console.log(
|
|
577
|
+
`Batch trim: Applied consistent 4s trim to ${batchVideos.length} videos`
|
|
578
|
+
);
|
|
660
579
|
```
|
|
661
580
|
|
|
662
|
-
We create multiple video blocks and apply identical trim settings to each one. This ensures consistency across clips—
|
|
581
|
+
We create multiple video blocks and apply identical trim settings to each one. This ensures consistency across clips—useful for creating video montages, multi-angle compositions, or any scenario where uniform clip lengths are required.
|
|
582
|
+
|
|
583
|
+
When batch processing, always load each video's resources before trimming. Check total duration to ensure your trim values don't exceed available media.
|
|
663
584
|
|
|
664
|
-
|
|
585
|
+
## Exporting Results
|
|
586
|
+
|
|
587
|
+
After applying trim settings, export the processed content to a file. In headless mode, we export a PNG snapshot to verify the trim configuration.
|
|
588
|
+
|
|
589
|
+
```typescript highlight-export
|
|
590
|
+
// Save the scene as a .scene file for later use or rendering
|
|
591
|
+
// This preserves all trim settings and can be loaded in any CE.SDK environment
|
|
592
|
+
console.log('Saving scene...');
|
|
593
|
+
|
|
594
|
+
const sceneString = await engine.scene.saveToString();
|
|
595
|
+
|
|
596
|
+
// Ensure output directory exists
|
|
597
|
+
if (!existsSync('output')) {
|
|
598
|
+
mkdirSync('output');
|
|
599
|
+
}
|
|
600
|
+
|
|
601
|
+
// Save to file
|
|
602
|
+
writeFileSync('output/trimmed-video.scene', sceneString);
|
|
603
|
+
console.log('Exported to output/trimmed-video.scene');
|
|
604
|
+
```
|
|
605
|
+
|
|
606
|
+
The export operation renders all video blocks at their current trim positions and saves the result to the file system. For full video encoding and export, use the browser SDK with video export capabilities. Always dispose of the engine instance when processing is complete to free resources.
|
|
665
607
|
|
|
666
608
|
## Trim vs Duration Interaction
|
|
667
609
|
|
|
@@ -675,18 +617,18 @@ With looping enabled, exceeding trim length causes the trimmed segment to repeat
|
|
|
675
617
|
|
|
676
618
|
For predictable behavior, always consider both trim and duration together. Set trim values first to define the source media segment you want. Then set duration to control playback length. If you want the entire trimmed segment to play once, match duration to trim length. For looping content, enable looping before setting a longer duration.
|
|
677
619
|
|
|
678
|
-
When building
|
|
620
|
+
When building automated pipelines, always coordinate trim and duration values. This prevents confusion about why a video isn't playing the full trimmed length (duration too short) or why it's holding on the last frame (duration too long without looping).
|
|
679
621
|
|
|
680
622
|
## Performance Considerations
|
|
681
623
|
|
|
682
|
-
CE.SDK's
|
|
624
|
+
CE.SDK's headless engine is optimized for server-side processing, but keep these factors in mind:
|
|
683
625
|
|
|
684
|
-
- **Resource loading**:
|
|
685
|
-
- **Trim adjustments**: Changing trim values is lightweight—CE.SDK updates the playback range without reprocessing the video.
|
|
686
|
-
- **
|
|
687
|
-
- **Long videos**: Very long source videos (30+ minutes) may have slower seeking to trim offsets.
|
|
626
|
+
- **Resource loading**: `forceLoadAVResource` has network and processing overhead. Load resources once, then apply trim operations as needed.
|
|
627
|
+
- **Trim adjustments**: Changing trim values is lightweight—CE.SDK updates the playback range without reprocessing the video.
|
|
628
|
+
- **Memory usage**: Each loaded video consumes memory. For batch processing many videos, consider processing in smaller batches.
|
|
629
|
+
- **Long videos**: Very long source videos (30+ minutes) may have slower seeking to trim offsets.
|
|
688
630
|
|
|
689
|
-
Test your trim operations
|
|
631
|
+
Test your trim operations with representative workloads to ensure acceptable performance for your use case.
|
|
690
632
|
|
|
691
633
|
## Troubleshooting
|
|
692
634
|
|
|
@@ -694,13 +636,13 @@ Test your trim operations on target devices early in development to ensure accep
|
|
|
694
636
|
|
|
695
637
|
If setting trim values has no visible effect, the most common cause is forgetting to await `forceLoadAVResource`. The resource must be loaded before trim values take effect. Always load resources first.
|
|
696
638
|
|
|
697
|
-
Another possibility is confusing time offset with trim offset. `setTimeOffset` controls when the block appears in the composition, while `setTrimOffset` controls where in the source media playback starts.
|
|
639
|
+
Another possibility is confusing time offset with trim offset. `setTimeOffset` controls when the block appears in the composition, while `setTrimOffset` controls where in the source media playback starts.
|
|
698
640
|
|
|
699
641
|
### Incorrect Trim Calculation
|
|
700
642
|
|
|
701
|
-
If trim values seem offset or produce unexpected results, verify you're calculating based on the source media duration, not the block duration. Use `
|
|
643
|
+
If trim values seem offset or produce unexpected results, verify you're calculating based on the source media duration, not the block duration. Use `getAVResourceTotalDuration` to understand the available media length.
|
|
702
644
|
|
|
703
|
-
Also check that
|
|
645
|
+
Also check that trim offset plus trim length doesn't exceed total duration. CE.SDK may clamp values automatically, but validating before setting prevents unexpected behavior.
|
|
704
646
|
|
|
705
647
|
### Playback Beyond Trim Length
|
|
706
648
|
|
|
@@ -720,6 +662,15 @@ If frame-accurate trimming doesn't land on exact frames, remember that floating-
|
|
|
720
662
|
|
|
721
663
|
Also understand codec limitations. Variable frame rate videos don't have perfectly uniform frame timing, so true frame accuracy may not be possible. Use constant frame rate sources for critical frame-accurate applications.
|
|
722
664
|
|
|
665
|
+
### Export Issues
|
|
666
|
+
|
|
667
|
+
If export fails or produces unexpected output:
|
|
668
|
+
|
|
669
|
+
- Verify all video resources loaded successfully before export
|
|
670
|
+
- Check that trim values are within valid ranges
|
|
671
|
+
- Ensure sufficient disk space for output files
|
|
672
|
+
- For large videos, monitor memory usage during export
|
|
673
|
+
|
|
723
674
|
## Best Practices
|
|
724
675
|
|
|
725
676
|
### Workflow Recommendations
|
|
@@ -728,8 +679,8 @@ Also understand codec limitations. Variable frame rate videos don't have perfect
|
|
|
728
679
|
2. Check `supportsTrim()` before applying trim operations
|
|
729
680
|
3. Coordinate trim length with block duration for predictable behavior
|
|
730
681
|
4. Use TypeScript for type safety with CE.SDK API
|
|
731
|
-
5.
|
|
732
|
-
6.
|
|
682
|
+
5. Validate trim values don't exceed total media duration
|
|
683
|
+
6. Dispose of engine instances when processing is complete
|
|
733
684
|
|
|
734
685
|
### Code Organization
|
|
735
686
|
|
|
@@ -741,8 +692,9 @@ Also understand codec limitations. Variable frame rate videos don't have perfect
|
|
|
741
692
|
### Performance Optimization
|
|
742
693
|
|
|
743
694
|
- Avoid redundant `forceLoadAVResource` calls—load once, trim multiple times
|
|
744
|
-
-
|
|
745
|
-
-
|
|
695
|
+
- Process videos in batches to manage memory usage
|
|
696
|
+
- Consider parallel processing for independent trim operations
|
|
697
|
+
- Test on target environments early to identify performance bottlenecks
|
|
746
698
|
|
|
747
699
|
## API Reference
|
|
748
700
|
|
|
@@ -763,11 +715,13 @@ Also understand codec limitations. Variable frame rate videos don't have perfect
|
|
|
763
715
|
| `setTimeOffset(id, offset)` | Set when block becomes active | `id: DesignBlockId, offset: number` | `void` |
|
|
764
716
|
| `getTimeOffset(id)` | Get block time offset | `id: DesignBlockId` | `number` |
|
|
765
717
|
|
|
718
|
+
|
|
719
|
+
|
|
766
720
|
---
|
|
767
721
|
|
|
768
722
|
## More Resources
|
|
769
723
|
|
|
770
|
-
- **[
|
|
724
|
+
- **[Node.js Documentation Index](https://img.ly/docs/cesdk/node.md)** - Browse all Node.js documentation
|
|
771
725
|
- **[Complete Documentation](./llms-full.txt.md)** - Full documentation in one file (for LLMs)
|
|
772
|
-
- **[Web Documentation](./
|
|
773
|
-
- **[Support](mailto:support@img.ly)** - Contact IMG.LY support
|
|
726
|
+
- **[Web Documentation](./node.md)** - Interactive documentation with examples
|
|
727
|
+
- **[Support](mailto:support@img.ly)** - Contact IMG.LY support
|