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,empresaJose De Oliveira,Motion Designer,Watermelon StudioLendo Google Sheets via API
import gspreadfrom 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.sheet1dados = aba.get_all_records()
for linha in dados: print(linha)Notificando via Slack quando o render termina
import requestsimport 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 requestsimport 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 Imageimport osimport 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 subprocessimport osimport glob
def batch_render_houdini(projects_dir, output_dir): hip_files = glob.glob(os.path.join(projects_dir, '*.hip'))
render_script = '''import hourop = 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 osimport shutilfrom 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í.