Currently I give away all my motion scripts for free. If you've found them useful and would like to support future development, you can do so here →
How to use the script
Always check code before running it on your computer. Even basic scripts like this one. If you’re not a developer, ask a LLM like ChatGPT, Claude, or Gemini to verify it for you.
Option 1: Install to your AE Folder
Download this and install the below .jsx file in your After Effects Script folder. You can then run it using the scripts menu, or by using a launcher like Quick Menu 3.
Option 2: Adapt the script yourself
Alternatively copy the code below and develop your own version. If you’re not a developer you can do this easily with a LLM like ChatGPT.
replaceFootageRandom.jsx2.2KB
/*
Replaces selected layers with randomly ordered selected footage from the project panel,
ensuring no two adjacent layers use the same footage.
*/
(function() {
var comp = app.project.activeItem;
if (!(comp && comp instanceof CompItem)) {
alert("Please select an active composition.");
return;
}
var selectedLayers = comp.selectedLayers;
if (selectedLayers.length === 0) {
alert("Please select at least one layer to replace.");
return;
}
var selectedItems = app.project.selection;
var footageItems = [];
for (var i = 0; i < selectedItems.length; i++) {
var item = selectedItems[i];
if (item instanceof FootageItem) {
footageItems.push(item);
}
}
if (footageItems.length === 0) {
alert("No footage items selected in the project panel.");
return;
}
app.beginUndoGroup("Replace Footage Randomly");
// Shuffle the footage items
function shuffleArray(array) {
for (var i = array.length - 1; i > 0; i--) {
var j = Math.floor(Math.random() * (i + 1));
var temp = array[i];
array[i] = array[j];
array[j] = temp;
}
}
var footageSequence = [];
while (footageSequence.length < selectedLayers.length) {
var shuffledFootage = footageItems.slice();
shuffleArray(shuffledFootage);
footageSequence = footageSequence.concat(shuffledFootage);
}
// Assign footage to layers
for (var j = 0; j < selectedLayers.length; j++) {
var layer = selectedLayers[j];
var currentFootage = footageSequence[j];
// Ensure no two adjacent layers have the same footage
if (j > 0 && currentFootage === footageSequence[j - 1]) {
// Swap with the next item if possible
if (j + 1 < footageSequence.length) {
var temp = footageSequence[j];
footageSequence[j] = footageSequence[j + 1];
footageSequence[j + 1] = temp;
currentFootage = footageSequence[j];
}
}
layer.replaceSource(currentFootage, false);
}
app.endUndoGroup();
})();