RolynTrotter/vibe-podcast

Cria gráficos por episódio de podcast a partir dos templates do Apple Motion (cartão de título principal, terços inferiores de citação) e os coloca no Final Cut Pro via FCPXML. Use quando for solicitado um cartão de título, citação/terço inferior, texto na tela ou qualquer coisa envolvendo arquivos .motn/.moti ou Motion.

O que é vibe-podcast?

Esta skill automatiza a geração de gráficos para episódios de podcast no ecossistema Apple, integrando Motion e Final Cut Pro. Como o Motion 5.9 não possui dicionário AppleScript ou renderizador por linha de comando, a skill opera diretamente nos arquivos XML do Motion (ozml) e gera arquivos FCPXML que referenciam os templates de título instalados, deixando a renderização final a cargo do Final Cut Pro. A skill oferece ferramentas como `motionkit.py` para inspecionar camadas de texto, modificar textos, visualizar quadros-chave e gerar prévias, além de `titles_fcpxml.py` para converter uma lista de deixa em um projeto FCPXML com títulos posicionados corretamente na linha do tempo. O fluxo típico envolve inspecionar o template, escrever um JSON com as informações do episódio (template, instante, duração opcional, mapeamento de textos) e gerar o FCPXML, que pode ser importado sem cliques adicionais com `--library` e `--push`. Testado no Final Cut Pro 11.0.1, a importação sem cliques funciona, a ordem dos textos corresponde à ordem no Motion, e o envio de texto puro preserva as configurações originais do template (fonte, tamanho, cor, sombra). Para cartões avulsos (como thumbnails), usa-se `set-text` no arquivo .motn e abre-se no Motion para visualização manual. A skill também expõe animações completas via XML, permitindo reajuste programático de quadros-chave, além de fornecer dicas de pré-visualização e renderização usando capturas de tela assistidas por computador.

Funciona com~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/RolynTrotter/vibe-podcast/tree/HEAD/.claude/skills/motion-graphics

Installed? Explore more Programação e Desenvolvimento skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

Perguntar na sua IA favorita

Abre um novo chat com esta habilidade de agente já pré-carregada.

Documentação

Motion graphics para o podcast

O Motion 5.9 não possui dicionário AppleScript nem renderizador via linha de comando. Tudo aqui funciona tratando arquivos do Motion como XML (ozml) e gerando FCPXML do Final Cut Pro que referencia os modelos de título instalados. O Final Cut faz a renderização.

As ferramentas estão em agent-motion/:

FerramentaO que faz
motionkit.py inspect FILE [--json]Árvore de camadas, camadas de texto (texto/fonte/tamanho/posição), temporização em segundos, o que está publicado no FCP, referências de mídia
motionkit.py set-text IN OUT --set "KEY=TEXT" ...Reescreve camadas de texto. KEY = id da camada, nome da camada ou texto atual. \n para quebras de linha. Corrige os comprimentos de styleRun (UTF-16) para que o Motion não engasgue
motionkit.py keyframes FILE [--grep X] [--all]Cada parâmetro animado com tempos/valores dos quadros-chave (rotação em radianos)
motionkit.py preview FILE --at 1.9 3.2 [--open]Escreve cópias paradas naqueles tempos; --open abre-as no Motion em segundo plano (open -g) para um app_screenshot
motionkit.py install FILE --name NAMECopia um projeto para a pasta Títulos do Motion como um modelo de título do FCP
titles_fcpxml.py SPEC.json -o OUT.fcpxmlLista de deixa → projeto FCPXML com títulos nos tempos corretos e textos preenchidos

Os modelos do programa

Instalados em ~/Library/Containers/com.apple.motionapp/Data/Movies/Motion Templates.localized/Titles.localized/Templates/ (uid do FCP: ~/Titles.localized/Templates/<Nome>/<Nome>.moti). Instantâneos dos dois principais estão em agent-motion/*.motn.

  • TF_Podcast_title: cartão de título principal, 5 s, 29,97, 1080p. Camadas de texto: Tiersias Foundation Podcast (mostra "Tiresias Foundation Podcast"; o nome da camada tem um erro de digitação, continue usando-o como chave) e Episode 4: Carl Schmitt (a linha por episódio, Futura Medium). Publica uma Zona de Soltar.
  • Citation v2: terço inferior para citações e fontes, PT Serif. Camadas de texto: ~Author Lastname (itálico; o programa prefixa com ~), Person Writes Silly Headline to (título da obra, pode ter duas linhas), 20 Apr, 1969 (data), Publication.
  • Citation v2 no pub: mesma sem a linha de publicação. Também Citation v1, Black/Orange/Yellow/PeeTitle, Minister_Types.

Uso anterior (das bibliotecas Podcast3/4): Timothy Snyder, Carl Schmitt, Xunzi, ~Eric L. Hutton, trans., ~Armando Iannucci, dir., 95 U.S. 602. Tradutores e diretores recebem um sufixo de função. Casos judiciais vão no campo de autor.

Fluxo de trabalho

  1. python3 agent-motion/motionkit.py inspect "<template>.moti" para obter as chaves das camadas de texto.
  2. Escreva um JSON de deixa (veja agent-motion/examples/ep_demo.json): template, at (segundos na linha do tempo do episódio), duration opcional, mapa texts.
  3. python3 agent-motion/titles_fcpxml.py cues.json -o titles.fcpxml, depois valide: xmllint --noout --dtdvalid <cópia de FCPXMLv1_11.dtd> titles.fcpxml. Os DTDs estão em /Applications/Final Cut Pro.app/Contents/Frameworks/Interchange.framework/Versions/A/Resources/. Copie um primeiro, porque o xmllint falha no caminho com espaços.
  4. Empurre-o: adicione --library <bundle> --push (zero cliques). Sem --library, o FCP mostra um seletor de biblioteca, então deixe isso para o usuário. Os títulos ficam conectados acima de uma lacuna, para que possam ser copiados para a edição real.

Para um cartão avulso (ex.: uma miniatura ou um cartão com uma alteração de estilo que o FCP não pode substituir), use set-text no .motn e open -g -a Motion OUT.motn para o usuário analisar ou exportar.

Verificado no FCP 11.0.1 (2026-10-18)

  • Importação com zero cliques funciona: titles_fcpxml.py cues.json -o x.fcpxml --library path/To.fcpbundle --push adiciona <import-options> (local da biblioteca, vincular ativos, suprimir avisos) e envia com open -g. O FCP importa em segundo plano e cria a biblioteca se ela estiver faltando. Use uma biblioteca descartável em scratch/fcp-test/ para testes, e nunca as bibliotecas reais do usuário sem perguntar.
  • Ordem <text> = ordem no documento Motion das camadas de Texto. Confirmado: autor, manchete, data e publicação do Citation v2 caem todos nos campos corretos.
  • Envie texto puro (o padrão --style none). Assim o modelo mantém sua própria fonte, tamanho, cor e sombra. --style font envia um text-style-def com família/tipo/tamanho. Qualquer definição de estilo substitui o modelo, e camadas sem o parâmetro Size (padrão do Motion 48) saíram minúsculas antes da adição do fallback 48. Use --style font apenas para reestilizar deliberadamente.
  • O cartão de título principal (TF_Podcast_title) é importado com sua animação intacta.
  • Leia o estado do FCP com app_screenshot em com.apple.FinalCut: clique no evento, depois no ícone do projeto no navegador (clicar duas vezes no nome inicia uma renomeação, então pressione Escape), depois na régua.

Visualização e renderização (verificado 2026-10-18)

  • Quadros de prévia: motionkit.py preview FILE --at T --open, depois use app_screenshot por computador no Motion (bundle com.apple.motionapp), então aumente o zoom na tela. Feche a janela com app_menu File > Close. Digitar no campo do playhead do Motion a partir do segundo plano NÃO move o playhead. A cópia <currentFrame> é a rota confiável.
  • Renderização: o uso por computador não pode pressionar File > Share (Export Movie, Save Current Frame). Peça ao usuário para clicar em Export. O shell screencapture não tem Permissão de Gravação de Tela.
  • Nunca open -a sem -g. O usuário está trabalhando na mesma tela.

Animação (o que o XML expõe)

Os quadros-chave são curve > keypoint{time, value, in/out tangents} sob qualquer parâmetro (Transformação Posição/Rotação/Escala, Opacidade de Mesclagem, parâmetros de filtro). Os comportamentos (Gather In, Pen Speed/Pressure) são seus próprios nós com parâmetros de Temporização e Controles. Portanto, podemos ler a coreografia completa, e reprogramar, deslocar ou adicionar quadros-chave programaticamente. Depois, prévia e captura de tela para verificar. Coreografia do TF_Podcast_title: as figuras Tiresias (Grupo 1/2) deslizam de ±400 px para 1,5 s, depois balançam ±10 px / ±2° até 4,87 s. O par de imagens de serpente aparece em 1,74 s (escala 0,17→0,62 até 2,1 s, mascarado por retângulos arredondados) e ataca entre quadros-chave em 2,1/3,17/4,14/4,87 s. A linha do título aparece em 1,5–1,7 s com Gather In a partir de 1,0 s, e a linha do episódio Gather In em 2,37 s.

Notas sobre ozml

  • Os tempos são "value timescale flags epoch"; segundos = value/timescale.
  • Conteúdo de texto: scenenode[factory=Text] > parameter[name=Object] > parameter[id=369] > text. A estilização é styleRun style=ID offset length, então uma incompatibilidade de comprimento quebra a estilização.
  • As fábricas no topo mapeiam factoryID → tipo (Text, Shape, Replicator, Image...). Os ids diferem por arquivo, então sempre resolva-os através da tabela de fábricas.
  • Referência (antiga, ainda em grande parte correta) da Apple: Motion XML guide em developer.apple.com archive.

Individual skills in this repo

This repo contains 1 individual skill — each has its own dedicated page.

Habilidades Relacionadas