Automatic renders of compisitions with text
I have a project that consists of three codes, the project is based on having a website hosted on localhost and changing two texts of a composition from that website so that the video is automatically rendered.
But I have a problem and it is that the render does it but without changing the texts.
Does anyone know how to fix it?
Index.html
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Renderizar Video</title>
<style>
body {
font-family: Arial, sans-serif;
margin: 20px;
}
input {
margin: 5px;
padding: 10px;
width: 300px;
}
button {
padding: 10px 20px;
margin-top: 10px;
}
</style>
</head>
<body>
<h1>Renderizar Video con Textos</h1>
<label for="nom">Nom:</label>
<input type="text" id="nom" placeholder="Introduce Nom"><br>
<label for="xarxes">Xarxes:</label>
<input type="text" id="xarxes" placeholder="Introduce Xarxes"><br>
<button id="renderButton">Render</button>
<script>
document.getElementById('renderButton').addEventListener('click', function() {
const nom = document.getElementById('nom').value;
const xarxes = document.getElementById('xarxes').value;
console.log('Datos enviados:', { nom, xarxes }); // Verifica los datos en la consola
fetch('http://localhost:8001/render', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({ nom, xarxes })
})
.then(response => {
if (!response.ok) {
throw new Error('Error en la solicitud: ' + response.statusText);
}
return response.text();
})
.then(data => {
console.log('Respuesta del servidor:', data); // Muestra la respuesta del servidor
alert('Renderizado iniciado');
})
.catch(error => {
console.error('Error:', error);
alert('Hubo un error: ' + error.message);
});
});
</script>
</body>
</html>
server.js
const http = require('http');
const fs = require('fs');
const path = require('path');
const { exec } = require('child_process');
const server = http.createServer((req, res) => {
if (req.method === 'POST' && req.url === '/render') {
let body = '';
req.on('data', chunk => {
body += chunk.toString(); // Convertir Buffer a string
});
req.on('end', () => {
try {
const { nom, xarxes } = JSON.parse(body);
console.log(`Renderizando con Nom: ${nom} y Xarxes: ${xarxes}`);
// Ruta del archivo del proyecto After Effects
const projectFilePath = "F:/OBS/Chyrons/Chyrons.aep";
// Ruta donde se guardará el archivo renderizado
const renderFolderPath = "F:/OBS/Chyrons/Render";
// Crear nombre de archivo de salida
const outputFileName = `CHY_DER_${nom}_${xarxes}.mov`;
const outputFilePath = `${renderFolderPath}/${outputFileName}`;
// Crear un archivo JSX temporal con los datos para reemplazar textos
const jsxScript = `
var projectFilePath = "${projectFilePath.replace(/\\/g, "/")}";
var renderFolderPath = "${renderFolderPath.replace(/\\/g, "/")}";
var nom = "${nom}";
var xarxes = "${xarxes}";
function updateTextsInComp(comp, nom, xarxes) {
var nomFound = false;
var xarxesFound = false;
for (var i = 1; i <= comp.numLayers; i++) {
var layer = comp.layer(i);
if (layer.property("Source Text") != null) {
if (layer.name === "Nom") {
layer.property("Source Text").setValue(nom);
$.writeln("Texto de Nom actualizado a: " + nom);
nomFound = true;
} else if (layer.name === "Xarxes") {
layer.property("Source Text").setValue(xarxes);
$.writeln("Texto de Xarxes actualizado a: " + xarxes);
xarxesFound = true;
}
}
}
if (!nomFound) {
$.writeln("No se encontró la capa 'Nom'.");
}
if (!xarxesFound) {
$.writeln("No se encontró la capa 'Xarxes'.");
}
}
function renderComp(comp) {
app.project.renderQueue.items.removeAll(); // Limpiar cola de renderizado
var renderQueueItem = app.project.renderQueue.items.add(comp); // Añadir la composición a la cola
var outputModule = renderQueueItem.outputModule(1); // Obtener el primer módulo de salida
var outputFilePath = new File(renderFolderPath + "/" + "CHY_DER_" + nom + "_" + xarxes + ".mov");
outputModule.file = outputFilePath; // Configurar la ruta de salida
$.writeln("Archivo de salida configurado en: " + outputFilePath.fsName); // Mensaje de depuración
app.project.renderQueue.render(); // Comienza el renderizado
}
function main() {
app.open(new File(projectFilePath)); // Abrir el proyecto
$.writeln("Proyecto abierto: " + projectFilePath);
var comp = null;
for (var i = 1; i <= app.project.numItems; i++) {
if (app.project.item(i).name === "CHY_DER_Persona") {
comp = app.project.item(i); // Encontrar la composición
break;
}
}
if (comp == null) {
$.writeln("Error: Composición CHY_DER_Persona no encontrada.");
alert("Composición CHY_DER_Persona no encontrada");
return;
}
updateTextsInComp(comp, nom, xarxes); // Actualizar textos
renderComp(comp); // Renderizar la composición
}
main();
`;
// Guardar el archivo JSX temporalmente
const jsxFilePath = path.join(__dirname, 'temp_render_script.jsx');
fs.writeFileSync(jsxFilePath, jsxScript);
// Comando para aerender
const pathToAerender = `"C:\\Program Files\\Adobe\\Adobe After Effects 2023\\Support Files\\aerender.exe"`;
// Ejecutar aerender con el proyecto, la composición y la salida
exec(`${pathToAerender} -project "${projectFilePath}" -comp "CHY_DER_Persona" -output "${outputFilePath}"`, (error, stdout, stderr) => {
if (error) {
console.error(`Error al ejecutar aerender: ${error.message}`);
res.writeHead(500, { 'Content-Type': 'text/plain' });
res.end(`Error al renderizar: ${error.message}`);
return;
}
if (stderr) {
console.error(`stderr: ${stderr}`);
res.writeHead(500, { 'Content-Type': 'text/plain' });
res.end(`Error en el script: ${stderr}`);
return;
}
console.log(`stdout: ${stdout}`);
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.end('Renderizado iniciado');
// Limpiar el archivo JSX temporal
fs.unlinkSync(jsxFilePath);
});
} catch (e) {
console.error(`Error al procesar JSON: ${e}`);
res.writeHead(400, { 'Content-Type': 'text/plain' });
res.end('Datos inválidos');
}
});
} else {
let filePath = path.join(__dirname, req.url === '/' ? 'index.html' : req.url);
let extname = String(path.extname(filePath)).toLowerCase();
let mimeTypes = {
'.html': 'text/html',
'.js': 'text/javascript',
'.css': 'text/css',
'.json': 'application/json',
};
let contentType = mimeTypes[extname] || 'application/octet-stream';
fs.readFile(filePath, (error, content) => {
if (error) {
if (error.code == 'ENOENT') {
res.writeHead(404, { 'Content-Type': 'text/html' });
res.end('<h1>404 Not Found</h1>', 'utf-8');
} else {
res.writeHead(500);
res.end('Sorry, there was an error: ' + error.code + '..\n');
}
} else {
res.writeHead(200, { 'Content-Type': contentType });
res.end(content, 'utf-8');
}
});
}
});
const PORT = 8001;
server.listen(PORT, () => {
console.log(`Servidor corriendo en http://localhost:${PORT}`);
});
your_script.jsx
// URL del servidor para recibir los datos
var projectFilePath = "F:/OBS/Chyrons/Chyrons.aep";
var renderFolderPath = "F:/OBS/Chyrons/Render";
// Obtener los argumentos pasados desde el servidor
var nom = app.project.renderQueue.arguments[0]; // Primer argumento
var xarxes = app.project.renderQueue.arguments[1]; // Segundo argumento
// Asegúrate de que los argumentos son válidos
if (!nom || !xarxes) {
alert("No se pasaron valores correctos para nom y xarxes.");
return;
}
// Función para actualizar los textos en la composición
function updateTextsInComp(comp, nom, xarxes) {
for (var i = 1; i <= comp.numLayers; i++) {
var layer = comp.layer(i);
if (layer.property("Source Text") != null) {
if (layer.name === "Nom") {
layer.property("Source Text").setValue(nom);
$.writeln("Texto de Nom actualizado a: " + nom);
} else if (layer.name === "Xarxes") {
layer.property("Source Text").setValue(xarxes);
$.writeln("Texto de Xarxes actualizado a: " + xarxes);
}
}
}
}
// Función para renderizar la composición
function renderComp(comp) {
app.project.renderQueue.items.removeAll(); // Limpiar la cola de renderizado
var renderQueueItem = app.project.renderQueue.items.add(comp); // Añadir la composición a la cola
var outputModule = renderQueueItem.outputModule(1); // Obtener el primer módulo de salida
// Configurar el archivo de salida
var outputFilePath = new File(renderFolderPath + "/" + "CHY_DER_" + nom + "_" + xarxes + ".mov");
outputModule.file = outputFilePath;
// Comienza el renderizado
app.project.renderQueue.render();
}
// Función principal
function main() {
app.open(new File(projectFilePath)); // Abrir el proyecto
var comp = null;
for (var i = 1; i <= app.project.numItems; i++) {
if (app.project.item(i).name === "CHY_DER_Persona") {
comp = app.project.item(i); // Encontrar la composición
break;
}
}
if (comp == null) {
alert("Composición CHY_DER_Persona no encontrada");
return;
}
updateTextsInComp(comp, nom, xarxes); // Actualizar textos
renderComp(comp); // Renderizar la composición
}
main();
Thank you very much for reading and trying to help.
Martí Franquesa
