Skip to content

Instantly share code, notes, and snippets.

@gordielachance
Last active May 21, 2026 12:55
Show Gist options
  • Select an option

  • Save gordielachance/da5fbe15d6ce393b5e365722c5a598f0 to your computer and use it in GitHub Desktop.

Select an option

Save gordielachance/da5fbe15d6ce393b5e365722c5a598f0 to your computer and use it in GitHub Desktop.
After Effects scripts that create a render jobs queue based on the markers of the active comp
/*
After Effects JSX Script
Creates render queue jobs from active comp markers (when they have a duration)
Author: G.Breant
*/
(function () {
var SKIP_IF_EXISTS = true;
app.beginUndoGroup("Create Render Jobs From Comp Markers");
var comp = app.project.activeItem;
if (!(comp && comp instanceof CompItem)) {
alert("Please select an active composition.");
return;
}
var markerProp = comp.markerProperty;
if (!markerProp || markerProp.numKeys === 0) {
alert("No composition markers found.");
return;
}
var projectFile = app.project.file;
var defaultPath = projectFile ? projectFile.parent.fsName : "~";
var renderFolder = Folder.selectDialog("Choose render output folder", defaultPath);
if (!renderFolder) return;
var mask = prompt(
"Render name mask (%compName%, %markerName% supported):",
"%compName%_%markerName%",
"Render Name Mask"
);
if (mask === null) return;
var rq = app.project.renderQueue;
var created = 0;
function sanitizeFileName(name) {
return name.replace(/[\/\\\:\*\?\"\<\>\|]/g, "_");
}
function stripExtension(name) {
var dot = name.lastIndexOf(".");
return dot !== -1 ? name.substring(0, dot) : name;
}
for (var i = 1; i <= markerProp.numKeys; i++) {
var mv = markerProp.keyValue(i);
var dur = mv.duration;
if (dur <= 0) continue;
var markerTime = markerProp.keyTime(i);
var markerName = (mv.comment && mv.comment !== "") ? mv.comment : ("marker_" + i);
var fileName = mask;
fileName = fileName.split("%markerName%").join(markerName);
fileName = fileName.split("%compName%").join(comp.name);
fileName = sanitizeFileName(fileName);
if (SKIP_IF_EXISTS) {
var found = false;
for (var r = 1; r <= rq.numItems; r++) {
try {
var existingFile = rq.item(r).outputModule(1).file;
if (existingFile && stripExtension(existingFile.name) === fileName) {
found = true;
break;
}
} catch (e) {}
}
if (found) continue;
}
var item = rq.items.add(comp);
try { item.applyTemplate("Best Settings"); } catch (e) {}
var compStart = comp.displayStartTime;
item.timeSpanStart = markerTime;
item.timeSpanDuration = dur;
var om = item.outputModule(1);
var ext = ".mov";
try {
var currentFile = om.file;
if (currentFile && currentFile.name.indexOf(".") !== -1) {
ext = currentFile.name.substring(currentFile.name.lastIndexOf("."));
}
} catch (e2) {}
om.file = new File(renderFolder.fsName + "/" + fileName + ext);
created++;
}
alert("Created " + created + " render job(s) from markers with duration.");
app.endUndoGroup();
})();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment