Scripts y API de Python
Bernard se puede automatizar de dos maneras:
- scripts que el propio Bernard lanza, sobre una tarea (tarea script), sobre una selección (acción), en una fecha (evento) o cuando cambia un valor (disparador);
- la API de Python (CallBernard): una biblioteca que un script, un plugin o una herramienta externa usa para leer y modificar lo que contiene Bernard.
Los scripts y la API están pensados para los TD y los desarrolladores de pipeline. Un artista no los necesita para trabajar.
Lo que pueden hacer los scripts
Mediante la API, un script puede:
- buscar objetos (proyectos, elementos, tareas, archivos, usuarios…);
- leer y escribir propiedades, una por una o varias a la vez;
- crear y eliminar objetos (una eliminación hecha por un script va a la papelera Garbage, restaurable como una eliminación hecha en la interfaz);
- calcular rutas según la variación de ruta y el sistema del puesto, crear versiones de archivos, guardar o regenerar miniaturas;
- copiar, mover, enviar o descargar archivos entre variaciones de ruta;
- leer las instrucciones de una tarea y marcarlas, leer y escribir el tiempo invertido;
- construir workflows de plantilla (tareas, compounds, enlaces) en una sola llamada;
- abrir un medio en el reproductor del estudio, como lo haría Bernard (consulta Revisión);
- mostrar en el cliente una ventana de mensaje o de elección de archivo.
Un script actúa con los permisos del usuario conectado. Una escritura rechazada por las reglas (máquina de estados,
permisos) no lanza ningún error: la llamada devuelve False. Consulta Workflows, estados y plantillas
para estas reglas.
Las tareas script
Una tarea script es una tarea del workflow que lanza un comando. Así, el script se convierte en una etapa del workflow, con sus fuentes, sus continuaciones y sus estados.
Lo que lleva:
| Propiedad | Función |
|---|---|
| Command | el comando que se lanza; es una expresión, que puede leer las propiedades de la tarea, del elemento, del proyecto… |
| Launch On | el puesto que ejecuta el script |
| Task Priority | el orden en la cola (de 1 a 99, la más alta pasa primero) |
| Log | la salida del script |
| Files | los archivos de la tarea |
Cómo se ejecuta:
- Cuando la tarea pasa a Ready (sus fuentes están terminadas), el Bernard del puesto designado la lanza. No hay botón Run: para relanzar un script, vuelve a poner su tarea en Ready.
- Pasa a WIP y su salida (normal y errores) se escribe en Log. Durante la ejecución, el Log se actualiza cada 5 segundos.
- Pasa a Done si el script termina con el código 0, y a Failed en caso contrario.
Reglas que conviene conocer:
- ¿Qué puesto? Con Launch On rellenado, es ese puesto, sea cual sea el usuario conectado. Con Launch On vacío, es el puesto actual del usuario asignado. En ambos casos la tarea debe tener exactamente un asignado; un puesto apagado o varios asignados impiden el lanzamiento automático (una advertencia lo explica en el Log). El caso típico es un usuario « robot » solo en su pareja departamento × rol.
- Cola. Como máximo 3 scripts se ejecutan a la vez en un puesto (Local Settings › Max Simultaneous Script). Los demás esperan, por prioridad; con la misma prioridad, en el orden en que pasaron a Ready.
- Cadenas de scripts. Con el ajuste de estudio Subsequent scripts are executed first, la cadena de scripts de un plano termina antes de que continúen los de otro plano.
- Parada. Pasar una tarea a Aborted detiene el script en curso (y los procesos que haya lanzado). Si una tarea se reasigna durante la ejecución (otro usuario, departamento o puesto), el script se detiene y la tarea pasa a Failed. Cerrar Bernard mientras se ejecuta un script pide una confirmación.
- Registro. El Log conserva el final de la salida si es demasiado larga (ajustes del estudio Max number of lines for the logs of a task script y Max size in kiloBytes for the logs of a task script).
- Un solo Bernard por puesto ejecuta los scripts: la instancia principal.
Acciones, disparadores y eventos
- Una acción es un comando guardado en los ajustes, que se lanza a mano sobre una selección (clic derecho, submenús por departamento), que puede arrancar con Bernard o que dispara un evento. Como máximo tres acciones se ejecutan a la vez (Max Simultaneous Action). Una acción tiene éxito si no escribe nada en su salida de error. La vista Action Log muestra « Waiting », « Running », « Success » o « Failed ».
- Un disparador vigila una propiedad (estado, versión, valor) y lanza una acción cuando se cumple una condición. Un disparador Changed no se lanza si el valor no cambia.
- Un evento lanza una acción en una fecha, para usuarios o roles, con una repetición (Never, Every Day, Every Week, Every Hour). Un evento que ya no se te asigna deja de lanzar su acción.
La API de Python
Referencia
La referencia completa, generada a partir del código y mantenida al día en cada versión, está en línea:
bernardengineapi.readthedocs.io
Encontrarás la clase CallBernard (comunicarse con Bernard), herramientas para las rutas y los programas de terceros (3DEqualizer, Nuke…) y las constantes que se usan con la API. Para cada método: qué hace, qué acepta, qué devuelve y los errores que señala. La aplicación abre esta referencia desde Help › API Documentation.
Conectarse
La API habla con el cliente de Bernard abierto en el mismo puesto, como un plugin de un programa de creación (consulta Integraciones DCC).
- El cliente de Bernard debe estar iniciado y conectado.
- Una conexión por hilo de ejecución: volver a llamar a
CallBernard()devuelve la misma. - Los objetos se designan por su identificador (24 caracteres hexadecimales) y las propiedades por su nombre (State, Start Frame…).
- Si ningún cliente escucha, la conexión se rechaza (
ConnectionRefusedError). Un error en el lado de Bernard lanza una excepción con la traza del cliente.
from Bernard import CallBernard
from Bernard.Static import State, ClassName
bernard = CallBernard()
print(bernard.GetCurrentUserID())
Ejemplos
Los ejemplos usan identificadores ficticios.
# Mis tareas por hacer, y pasar la primera a WIP
for task_id in bernard.GetMyTasks():
print(bernard.GetPropertyValue(task_id, "Name"))
task_id = bernard.GetMyTasks()[0]
if not bernard.SetPropertyValue(task_id, "State", State.wip):
print("rechazado: asignación, checklist, corrección activa…")
# Publicar una nueva versión de un archivo y obtener su ruta en este puesto
bernard.IncrementVersion(file_id)
print(bernard.GetPathValue(nodeID=file_id))
# Los planos de una secuencia que tienen una tarea en curso
shots = bernard.FindNodeIDs(parentIDs=[sequence_id], classNames=[ClassName.projectItem],
projectItemModelName="Shot")
wip = bernard.FindNodeIDs(parentIDs=[sequence_id], classNames=[ClassName.task],
propertyFilter={"State": [State.wip, State.pause]})
# Abrir un archivo en el reproductor del estudio
bernard.OpenInPlayer(nodeID=file_id)
Familias de métodos
| Necesidad | Métodos (ejemplos) |
|---|---|
| Navegar por el árbol | GetRootID, GetParentID, GetProjectID, GetIdFromBernardPath |
| Buscar | FindNodeIDs, GetMyTasks, HasProperty, HasTags |
| Leer y escribir propiedades | GetPropertyValue, SetPropertyValue, GetPropertiesValues, SetPropertiesValues |
| Workflows y tareas | GetCurrentTaskIDs, GetItemTasks, CreateWorkflowTasks, ExportWorkflowTasks |
| Archivos, rutas y versiones | GetPathValue, SetPathValue, IncrementVersion, CreateFiles, UpdateFileThumbnail |
| Copiar, mover, enviar, descargar | FileOperation, FileOperationFromPath |
| Crear y eliminar | CreateNode, DeleteNodes, CreateUsers |
| Instrucciones y tiempo invertido | GetTaskInstructions, SetInstructionChecked, GetTimeLog, SetTimeLog |
| Usuarios y ajustes | GetCurrentUserID, GetAllUsers, GetSettingsAttributeValue |
| Aplicaciones | GetAppPathByExtension, GetAppPathsByExtension |
| Interfaz y reproductor | OpenInPlayer, BringToForeground, showMSGWindow, PopUpFileDialog |
La lista completa y los parámetros están en la referencia en línea.
Novedades de la API en la 2.1.48
- Crear y configurar tareas y compounds en el workflow de una plantilla en una sola llamada (propiedades, modos global / local, enlaces), exportarlos, cambiar el modo de una propiedad; todo se comprueba antes de escribir nada.
- Crear una plantilla de elemento de proyecto con su workflow vacío.
- Buscar por propiedad con una lista de valores (por ejemplo varios estados para State): un elemento coincide si tiene alguno de ellos.
- Listar todas las aplicaciones capaces de abrir una extensión, por prioridad, para tomar la primera instalada en el puesto.
- Una API que se niega a crear un archivo bajo una tarea de validación, donde no sería visible en ninguna parte.
- Buscar los hijos de una carpeta ya no lee toda la base de datos y ya no se interrumpe a los 60 segundos (corrección del 2026-11-09, consulta Notas de la versión).
Ejemplos de automatización en estudios
Estos ejemplos muestran lo que algunos estudios han automatizado con la API. Son scripts propios de estudios, no funciones del producto. Se describen aquí sin nombre de estudio ni de proyecto, para ilustrar las posibilidades.
| Necesidad | Lo que hace el script | Lanzamiento |
|---|---|---|
| Conciliar presupuestos, entregas y producción | compara una tabla de presupuestos, los metadatos de los archivos entregados y los datos de Bernard, muestra las diferencias, te deja elegir el valor correcto y lo corrige | acción sobre un grupo de planos |
| Ordenar una entrega sin teclear | encuentra la secuencia de imágenes de un plano, lee sus metadatos, rellena el plano, copia las imágenes en el archivo de plate como nueva versión | tarea script del plano |
| Barrera de calidad antes de la validación | rechaza una entrega incompleta (imágenes que faltan, resolución, capas esperadas) escribiendo un informe en el Log; la tarea pasa a Failed si hay error | tarea script antes de la validación |
| Renderizar y convertir sin abrir el programa | encuentra la aplicación por la extensión del archivo, calcula la ruta con la expresión, guarda el render en la versión correcta | tarea script |
| Construir workflows con código | describe un workflow en JSON y lo aplica, primero « en seco » para ver qué se haría | línea de comandos |
| Conectar otras herramientas | publica una preview en una herramienta de seguimiento de terceros, avisa por correo cuando alguien no ha llegado | tarea script o tarea programada |
Principios que ilustran estos ejemplos:
- pedir las rutas a Bernard (
GetPathValue), según la variación de ruta del puesto, en lugar de escribirlas fijas; - encontrar las aplicaciones y FFmpeg a través de la instalación de Bernard, no con una ruta fija;
- pasar por la API pública
CallBernard, en un proceso separado, en lugar de usar interfaces internas del cliente.
Ir más lejos
- Workflows, estados y plantillas: los estados de las tareas, las tareas script en el workflow.
- Integraciones DCC: los plugins de los programas de creación, que usan la misma API.
- Revisión: abrir un medio en Bernard Review.
- Referencia de la API: bernardengineapi.readthedocs.io.