Last active
May 21, 2026 12:55
-
-
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
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| /* | |
| 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