• Global community
    • Language:
      • Deutsch
      • English
      • Español
      • Français
      • Português
  • 日本語コミュニティ
    Dedicated community for Japanese speakers
  • 한국 커뮤니티
    Dedicated community for Korean speakers
Exit
0

Need small script modification for "replacer" script

Participant ,
Oct 05, 2022 Oct 05, 2022

Copy link to clipboard

Copied

Hi

I have a large number (hundreds) of video files where I need to do the same correction so I was looking for a way to automate this process as much as possible. And I found the Replacer script.on site oizys org
Here is its code.

/*
 After effects script
 This will take a template and add multiple compositions after replacing a source.
 It will open a fileselector
 This will replace the source of a layer. The layer should be called 'replace'. Then it will copy the composition and
 do the same for another file picked via the fileselector.
 */
{
    function SmartImport() {
        var scriptName = "Example replace";
        // Ask the user for a folder whose contents are to be imported.
        var targetFolder = Folder.selectDialog("Import items from folder...");
        if (targetFolder != null) {
            // If no project open, create a new project to import the files into.
            if (!app.project) {
                app.newProject();
            }
            function processFile(theFile) {
                try {
                    // Create a variable containing ImportOptions.
                    var importOptions = new ImportOptions(theFile);
                    try {
                        var currentItem = app.project.importFile(importOptions);
                        for (var i = 1; i <= app.project.items.length; i++) {
                            var elm = app.project.items[i];
                            // Look for the template composition
                            if (elm instanceof CompItem && elm.name === 'template') {
                                var netItem = app.project.item(i).duplicate();
                                for (var j = 1; j <= netItem.numLayers; j++) {
                                    // Replace the soure of the item called 'replace'
                                    if (netItem.layer(j).name === 'replace') {
                                        netItem.layer(j).replaceSource(currentItem, true);
                                    }
                                }
                            }
                        }
                    } catch (error) {
                        alert(error.toString() + importOptions.file.fsName, scriptName);
                    }
                } catch (error) {
                    // Ignore errors.
                }
            }
            function processFolder(theFolder) {
                // Get an array of files in the target folder.
                var files = theFolder.getFiles();
                for (index in files) { // Go through the array and set each element to singleFile, then run the following.
                    if (files[index] instanceof File) {
                        processFile(files[index]); // Calls the processFile function above.
                    }
                }
            }
            // Recursively examine that folder.
            processFolder(targetFolder);
        }
    }
    SmartImport();
}


It does what I need - im creates a project in AE with a composition "template" in which all the layers that need to be substituted are called "replace".
The script asks you to specify a folder and for each file in this folder duplicates the composition of "template", replacing the layers "replace" this file. I.e. for 50 files in folder it will create 50 copies of the composition.
What I need to improve - is the automatic renaming  of these compositions by filename of replacing file. For now its make result as composition "template2", "template3"... etc  and im need to rename each composition by hand when im export this composition. 
I want for composition where layer "replace" replaced by file  aaa.mov, create a composition not "template#" but named "aaa" or "aaa.mov" so that when I send it for export the exported file will automatically be called "aaa.mp4" as well. Its looks like easy mod which can get rid of a certain amount of pointless manual work that can be automated.
The problem is that I am a complete zero in coding and scripting. 
I tried to modify a piece of code like this:

if (elm instanceof CompItem && elm.name === 'template') {
                                var netItem = app.project.item(i).duplicate();
				app.project.item(i+1).name = currentItem.name;	
				netItem = app.project.item(i+1);			
                                for (var j = 1; j <= netItem.numLayers; j++) {

There im change its just added one string in first cycle

app.project.item(i+1).name = currentItem.name;

and its even worked...  once for one  composition (i.e. composition was created and named as "file name" instead of 
template#" but its stopped working for next try, the script caused an endless cycle of copyingcomposition. So im do something wrong. 

 I hope someone will look and show me the right line. 
Thanks

TOPICS
Scripting

Views

251

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines

correct answers 1 Correct answer

Community Expert , Oct 06, 2022 Oct 06, 2022

Ah, OK. After tinkering with the processFile function a little, it seems to work:

		function processFile(theFile) {
			try {
				// Create a variable containing ImportOptions.
				var importOptions = new ImportOptions(theFile);
				try {
					var currentItem = app.project.importFile(importOptions);
					var elm = null;
					for (var i = 1; i <= app.project.items.length; i++) {
						elm = app.project.items[i];
						// Look for the template composition
						if (elm instanceof CompItem && elm.na
...

Votes

Translate

Translate
Community Expert ,
Oct 05, 2022 Oct 05, 2022

Copy link to clipboard

Copied

I haven't tested this, but I think after this line:

var netItem = app.project.item(i).duplicate();

you need to add a line like this:

netItem.name = currentItem.name;

or this:

netItem.name = currentItem.name.split(".")[0];

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Participant ,
Oct 06, 2022 Oct 06, 2022

Copy link to clipboard

Copied

Thanks for reply. 

Unfortunetly its not work. As im remeber im tried this command already and its do same - yes, its change name of composition as im need, but then its do infinty loop of copying its one composition.  

 

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Community Expert ,
Oct 06, 2022 Oct 06, 2022

Copy link to clipboard

Copied

Ah, OK. After tinkering with the processFile function a little, it seems to work:

		function processFile(theFile) {
			try {
				// Create a variable containing ImportOptions.
				var importOptions = new ImportOptions(theFile);
				try {
					var currentItem = app.project.importFile(importOptions);
					var elm = null;
					for (var i = 1; i <= app.project.items.length; i++) {
						elm = app.project.items[i];
						// Look for the template composition
						if (elm instanceof CompItem && elm.name === 'template') break;
					}
					if (elm == null) return;
					var netItem = elm.duplicate();
					netItem.name = currentItem.name.split(".")[0];
					for (var j = 1; j <= netItem.numLayers; j++) {
						// Replace the soure of the item called 'replace'
						if (netItem.layer(j).name === 'replace') {
							netItem.layer(j).replaceSource(currentItem, true);
						}
					}
				} catch (error) {
					alert(error.toString() + importOptions.file.fsName, scriptName);
				}
			} catch (error) {
				// Ignore errors.
			}
		}

 

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Participant ,
Oct 07, 2022 Oct 07, 2022

Copy link to clipboard

Copied

Its worked! Im tested it and all work like a charm. Thanks a lot! 

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Participant ,
Oct 07, 2022 Oct 07, 2022

Copy link to clipboard

Copied

LATEST

Thanks for Dan Ebberts script now modifed for name composition not "template" but for name of replaced file (its allow to no rename each compostion by hand). 

Full script bellow (originaly downloaded from oizys org )

/*
 After effects script
 This will take a template and add multiple compositions after replacing a source.
 It will open a fileselector
 This will replace the source of a layer. The layer should be called 'replace'. Then it will copy the composition and
 do the same for another file picked via the fileselector.
 */
{
    function SmartImport() {
        var scriptName = "Example replace";
        // Ask the user for a folder whose contents are to be imported.
        var targetFolder = Folder.selectDialog("Import items from folder...");
        if (targetFolder != null) {
            // If no project open, create a new project to import the files into.
            if (!app.project) {
                app.newProject();
            }

	function processFile(theFile) {
			try {
				// Create a variable containing ImportOptions.
				var importOptions = new ImportOptions(theFile);
				try {
					var currentItem = app.project.importFile(importOptions);
					var elm = null;
					for (var i = 1; i <= app.project.items.length; i++) {
						elm = app.project.items[i];
						// Look for the template composition
						if (elm instanceof CompItem && elm.name === 'template') break;
					}
					if (elm == null) return;
					var netItem = elm.duplicate();
					netItem.name = currentItem.name.split(".")[0];
					for (var j = 1; j <= netItem.numLayers; j++) {
						// Replace the soure of the item called 'replace'
						if (netItem.layer(j).name === 'replace') {
							netItem.layer(j).replaceSource(currentItem, true);
						}
					}
				} catch (error) {
					alert(error.toString() + importOptions.file.fsName, scriptName);
				}
			} catch (error) {
				// Ignore errors.
			}
		}

            function processFolder(theFolder) {
                // Get an array of files in the target folder.
                var files = theFolder.getFiles();
                for (index in files) { // Go through the array and set each element to singleFile, then run the following.
                    if (files[index] instanceof File) {
                        processFile(files[index]); // Calls the processFile function above.
                    }
                }
            }
            // Recursively examine that folder.
            processFolder(targetFolder);
        }
    }
    SmartImport();
}

 

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines