Skip to main content

Integração com APIs e batch processing

Conectar o pipeline a fontes externas de dados abre possibilidades enormes: popular templates com dados de planilhas, notificar clientes via Slack, ou baixar assets de bibliotecas online. E processar múltiplos arquivos automaticamente — sem abrir cada um manualmente — é a diferença entre 10 minutos e 3 horas de trabalho.

Lendo um CSV para população de template

import csv
def ler_dados_csv(arquivo):
dados = []
with open(arquivo, newline="", encoding="utf-8") as f:
reader = csv.DictReader(f)
for linha in reader:
dados.append(linha)
return dados
dados = ler_dados_csv("/projetos/lista_nomes.csv")
for pessoa in dados:
print(f"Nome: {pessoa['nome']}, Cargo: {pessoa['cargo']}")

Exemplo de CSV esperado:

nome,cargo,empresa
Jose De Oliveira,Motion Designer,Watermelon Studio

Lendo Google Sheets via API

import gspread
from google.oauth2.service_account import Credentials
scopes = ["https://www.googleapis.com/auth/spreadsheets.readonly"]
creds = Credentials.from_service_account_file("credenciais.json", scopes=scopes)
client = gspread.authorize(creds)
planilha = client.open("Minha Planilha")
aba = planilha.sheet1
dados = aba.get_all_records()
for linha in dados:
print(linha)

Notificando via Slack quando o render termina

import requests
import json
def notificar_slack(webhook_url, mensagem):
payload = {"text": mensagem}
response = requests.post(
webhook_url,
data=json.dumps(payload),
headers={"Content-Type": "application/json"}
)
return response.status_code == 200
WEBHOOK = "https://hooks.slack.com/services/xxx/yyy/zzz"
notificar_slack(WEBHOOK, "Render da cena01 concluido! 240 frames prontos.")

Baixando HDRIs da Poly Haven API

import requests
import os
def baixar_hdri(nome, resolucao="4k", pasta="/assets/hdri"):
url = f"https://api.polyhaven.com/files/{nome}"
response = requests.get(url)
data = response.json()
hdri_url = data["hdri"][resolucao]["hdr"]["url"]
arquivo = os.path.join(pasta, f"{nome}_{resolucao}.hdr")
if not os.path.exists(arquivo):
print(f"Baixando {nome}...")
r = requests.get(hdri_url)
with open(arquivo, "wb") as f:
f.write(r.content)
print(f"Salvo: {arquivo}")
return arquivo
baixar_hdri("autumn_field", "4k")

Converter pastas de imagens com Pillow

from PIL import Image
import os
import glob
def convert_exr_to_png(input_dir, output_dir):
os.makedirs(output_dir, exist_ok=True)
files = glob.glob(os.path.join(input_dir, '*.exr'))
print(f"Encontrados {len(files)} arquivos.")
for f in sorted(files):
filename = os.path.basename(f).replace('.exr', '.png')
output_path = os.path.join(output_dir, filename)
img = Image.open(f)
img = img.convert('RGB')
img.save(output_path)
print(f" OK: {filename}")
print("Conversao concluida.")
convert_exr_to_png('/renders/exr_sequence', '/renders/png_sequence')

Batch render de projetos Houdini via CLI

import subprocess
import os
import glob
def batch_render_houdini(projects_dir, output_dir):
hip_files = glob.glob(os.path.join(projects_dir, '*.hip'))
render_script = '''
import hou
rop = hou.node('/out/mantra1')
rop.render()
'''
for hip in hip_files:
project_name = os.path.splitext(os.path.basename(hip))[0]
out_path = os.path.join(output_dir, project_name)
os.makedirs(out_path, exist_ok=True)
print(f"Renderizando: {project_name}")
cmd = ['hython', '-c', render_script, hip]
result = subprocess.run(cmd, capture_output=True, text=True)
if result.returncode == 0:
print(f" OK: concluido")
else:
print(f" Erro: {result.stderr[:200]}")
batch_render_houdini('/projects/shots', '/renders/output')

Organizar arquivos de projeto por extensão

import os
import shutil
from pathlib import Path
def organize_project_files(source_dir, target_dir):
ext_map = {
'.exr': 'renders',
'.png': 'renders',
'.jpg': 'images',
'.mp4': 'video',
'.mov': 'video',
'.hip': 'houdini',
'.c4d': 'cinema4d',
'.aep': 'after_effects',
'.blend': 'blender',
}
for file in Path(source_dir).rglob('*'):
if file.is_dir():
continue
ext = file.suffix.lower()
folder = ext_map.get(ext, 'misc')
dest_dir = Path(target_dir) / folder
dest_dir.mkdir(parents=True, exist_ok=True)
dest = dest_dir / file.name
shutil.copy2(file, dest)
print(f" {file.name} para /{folder}/")
organize_project_files('/Downloads/project_files', '/Projects/organized')

Gerando relatório HTML de renders

def gerar_relatorio(renders, saida="relatorio.html"):
html = "<html><body><h1>Relatorio de Render</h1><ul>"
for r in renders:
html += f"<li>{r['cena']}: {r['frames']} frames, {r['status']}</li>"
html += "</ul></body></html>"
with open(saida, "w") as f:
f.write(html)
print(f"Relatorio gerado: {saida}")

Info

Para o Google Sheets funcionar, você precisa criar uma Service Account no Google Cloud Console e baixar o JSON de credenciais. O gspread cuida do OAuth a partir daí.