- after-effects-mcp
- src
- scripts
// applyEffectTemplate.jsx
// Applies predefined effect templates to layers
function applyEffectTemplate(args) {
try {
// Extract parameters
var compIndex = args.compIndex || 1; // Default to first comp
var layerIndex = args.layerIndex || 1; // Default to first layer
var templateName = args.templateName; // Name of the template to apply
var customSettings = args.customSettings || {}; // Optional customizations
if (!templateName) {
throw new Error("You must specify a templateName");
}
// Find the composition by index
var comp = app.project.item(compIndex);
if (!comp || !(comp instanceof CompItem)) {
throw new Error("Composition not found at index " + compIndex);
}
// Find the layer by index
var layer = comp.layer(layerIndex);
if (!layer) {
throw new Error("Layer not found at index " + layerIndex + " in composition '" + comp.name + "'");
}
// Template definitions
var templates = {
// Blur effects
"gaussian-blur": {
effectMatchName: "ADBE Gaussian Blur 2",
settings: {
"Blurriness": customSettings.blurriness || 20
}
},
"directional-blur": {
effectMatchName: "ADBE Motion Blur",
settings: {
"Direction": customSettings.direction || 0,
"Blur Length": customSettings.length || 10
}
},
// Color correction effects
"color-balance": {
effectMatchName: "ADBE Color Balance (HLS)",
settings: {
"Hue": customSettings.hue || 0,
"Lightness": customSettings.lightness || 0,
"Saturation": customSettings.saturation || 0
}
},
"brightness-contrast": {
effectMatchName: "ADBE Brightness & Contrast 2",
settings: {
"Brightness": customSettings.brightness || 0,
"Contrast": customSettings.contrast || 0,
"Use Legacy": false
}
},
"curves": {
effectMatchName: "ADBE CurvesCustom",
// Curves are complex and would need special handling
},
// Stylistic effects
"glow": {
effectMatchName: "ADBE Glow",
settings: {
"Glow Threshold": customSettings.threshold || 50,
"Glow Radius": customSettings.radius || 15,
"Glow Intensity": customSettings.intensity || 1
}
},
"drop-shadow": {
effectMatchName: "ADBE Drop Shadow",
settings: {
"Shadow Color": customSettings.color || [0, 0, 0, 1],
"Opacity": customSettings.opacity || 50,
"Direction": customSettings.direction || 135,
"Distance": customSettings.distance || 10,
"Softness": customSettings.softness || 10
}
},
// Common effect chains
"cinematic-look": {
effects: [
{
effectMatchName: "ADBE Curves",
settings: {} // Would need special handling
},
{
effectMatchName: "ADBE Vibrance",
settings: {
"Vibrance": 15,
"Saturation": -5
}
},
{
effectMatchName: "ADBE Vignette",
settings: {
"Amount": 15,
"Roundness": 50,
"Feather": 40
}
}
]
},
"text-pop": {
effects: [
{
effectMatchName: "ADBE Drop Shadow",
settings: {
"Shadow Color": [0, 0, 0, 1],
"Opacity": 75,
"Distance": 5,
"Softness": 10
}
},
{
effectMatchName: "ADBE Glow",
settings: {
"Glow Threshold": 50,
"Glow Radius": 10,
"Glow Intensity": 1.5
}
}
]
}
};
// Check if the requested template exists
var template = templates[templateName];
if (!template) {
var availableTemplates = Object.keys(templates).join(", ");
throw new Error("Template '" + templateName + "' not found. Available templates: " + availableTemplates);
}
var appliedEffects = [];
// Apply single effect or multiple effects based on template structure
if (template.effectMatchName) {
// Single effect template
var effect = layer.Effects.addProperty(template.effectMatchName);
// Apply settings
for (var propName in template.settings) {
try {
var property = effect.property(propName);
if (property) {
property.setValue(template.settings[propName]);
}
} catch (e) {
$.writeln("Warning: Could not set " + propName + " on effect " + effect.name + ": " + e);
}
}
appliedEffects.push({
name: effect.name,
matchName: effect.matchName
});
} else if (template.effects) {
// Multiple effects template
for (var i = 0; i < template.effects.length; i++) {
var effectData = template.effects[i];
var effect = layer.Effects.addProperty(effectData.effectMatchName);
// Apply settings
for (var propName in effectData.settings) {
try {
var property = effect.property(propName);
if (property) {
property.setValue(effectData.settings[propName]);
}
} catch (e) {
$.writeln("Warning: Could not set " + propName + " on effect " + effect.name + ": " + e);
}
}
appliedEffects.push({
name: effect.name,
matchName: effect.matchName
});
}
}
return JSON.stringify({
status: "success",
message: "Effect template '" + templateName + "' applied successfully",
appliedEffects: appliedEffects,
layer: {
name: layer.name,
index: layerIndex
},
composition: {
name: comp.name,
index: compIndex
}
}, null, 2);
} catch (error) {
return JSON.stringify({
status: "error",
message: error.toString()
}, null, 2);
}
}
// Get arguments passed from Node.js process
var args;
try {
args = JSON.parse($.getenv("args"));
} catch (e) {
args = {};
}
// Run the function and write the result
var result = applyEffectTemplate(args);
// Write the result so it can be captured by the Node.js process
$.write(result);