O que filmcraft faz?
Atualizações: se esta pasta tiver um arquivo
.installed-from(escrito quando foi copiado do repositório), executegit ls-remote https://gitlab.com/e1dred/agent-skills.git HEADuma vez por sessão. Pegue o hash na linha de saída que termina exatamente comHEAD; se diferir do arquivo, informe ao usuário que uma versão mais recente existe e ofereça-se para atualizá-la (consulte "Atualizando" em https://gitlab.com/e1dred/agent-skills/-/blob/main/INSTALL.md, que pode mesclar edições locais); nunca atualize sem perguntar. Compare os hashes após remover espaços em branco. Se não houver arquivo, um clone ou link simbólico, ou nenhuma rede (saída vazia ou um erro degit ls-remote): ignore silenciosamente.
Notas de campo das primeiras tarefas headless, testado pela última vez no FilmCraft 0.17.1 (Linux AppImage). O FilmCraft é um editor de vídeo no estilo Premiere em Rust, em fase alfa inicial. Cada item de menu e botão é um comando do mecanismo; a CLI, o servidor MCP e o canal de controle do aplicativo executam os mesmos comandos. Se filmcraft-cli --version for mais recente, verifique novamente qualquer coisa aqui antes de confiar.
Configuração
- CLI: extraia-o do AppImage (
filmcraft.appimage --appimage-extract, copieusr/bin/filmcraft-clipara algum local estável); autossuficiente, sem janela. Nunca execute--versionno próprio AppImage. - Headless:
filmcraft-cli --project p.fcproj exec <id> key=value …; scripts são linhas JSON e mantêm uma sessão:filmcraft-cli --project p.fcproj run script.jsonl [--save]com linhas{"id":"…","params":{…}}, oufilmcraft-cli runautônomo apósfile.newProject. Subcomandos:commands,describe,inspect,import,export,render,probe. - Aplicativo ao vivo:
filmcraft --control 9876(ouFILMCRAFT_CONTROL_PORT); o ouvinte precisa deFILMCRAFT_CONTROL_TOKEN(64 caracteres hexadecimais) no ambiente — sem ele, permanece fechado. Faça a ponte comfilmcraft-cli mcp --bridge 127.0.0.1:9876. - MCP:
filmcraft-cli mcp(headless) ou--bridge(ao vivo).
Onde as coisas estão
Leia o arquivo que corresponde à tarefa; cada um lista as seções que contém. Use grep -n em reference/ para encontrar um id de comando.
Arquivo em reference/ | Leia para | Seções |
|---|---|---|
projects-and-timeline.md | Projetos, importação de mídia, sequências, playhead, razor e trim, marcadores, salvar, transições, efeitos de vídeo e keyframes, frame holds, notas do projeto | Projetos e mídia; Sequências; Corte e trim; Marcadores e salvar; Transições; Efeitos de vídeo e keyframes; Frame holds, seleção e notas do projeto; Outras ferramentas de edição |
titles-and-graphics.md | Camadas de texto e forma, tamanho/ajuste em quadros pequenos, leitura de camadas, texto vertical e imagens importadas | Títulos; Dimensionamento e ajuste; Propriedades da camada; Outras ferramentas de camada |
audio-mixer.md | Strips do mixer, valores, submixes, inserts e sends; ganho do clipe e Essential Sound | Mixer; Áudio do clipe |
captions.md | Trilhas de legenda, adicionar/editar/mover legendas, importação e exportação SRT | Trilhas de legenda e SRT |
export.md | Predefinições e formatos de exportação, fila de exportação, exportação MP4/GIF, imagens estáticas, exportações de intercâmbio, sondagem | Predefinições; Exportação; Predefinições e fila de exportação; Imagens estáticas; Sondagem |
command-catalogue.md | Cada outro id de comando por família (clip, timeline, sequence, trim, graphics, edit, file, project, multicam, source, prefs, shortcuts, …), cada um marcado como verificado (caminho JSON antigo → novo), retornou um resultado, executou ou recusou com o motivo; a configuração que desbloqueia comandos dependentes de seleção | Uma seção por família |
live-app.md | Conduzir o aplicativo em execução via --bridge: as ferramentas ui_*, o que funciona apenas ao vivo, executá-lo em uma tela oculta | Conectando; O que o aplicativo ao vivo adiciona |
newer-commands.md | O que cada versão adicionou ou alterou | 0.17.0; 0.17.1 |
log.md | Registro datado do que foi testado e quando | Registro |
Comandos essenciais da CLI (verificados)
filmcraft-cli commands --json # 716 comandos: id, label, menu, params, enabled
filmcraft-cli describe file.import # documentação de parâmetros para um comando
filmcraft-cli --project p.fcproj inspect # {project:{…}, sequence:{…}} como JSON
filmcraft-cli import clip.mp4 --project p.fcproj
filmcraft-cli --project p.fcproj export out.mp4 --scale 0.5 --quality 70
filmcraft-cli --project p.fcproj render --seconds 2 --out frame.png
filmcraft-cli probe clip.mp4 # tipo, duração (ticks), detalhes do stream de vídeo/áudio
- Um script JSONL mantém estado:
file.newProject→file.import {"paths":["clip.mp4"]}→{"items":[1]}→file.newSequenceFromClip {"items":[1]}→{"clips":[6,7],"sequence":4}→ … →file.saveAs {"path":"p.fcproj"}. - Passe
--projectem cada chamada CLI posterior: sem ele, cada invocação é uma nova sessão.
Armadilhas
- Os tempos são em ticks, não em quadros: a sequência relata 762.048.000.000 para 3 s (254.016.000.000 ticks/s);
playhead.setaceitaseconds,frame,timeoutimecodee snap para o quadro mais próximo (1,5 s → quadro 37). - Uma camada de texto no tamanho padrão transborda em um quadro pequeno.
graphics.newTextpadroniza para 100 px: em uma sequência de 320×180, "Hello FilmCraft" comsize:48desenhou 334,7 px de largura a partir de x=40 e foi cortada na borda direita. Ajuste definindosize(~32 → 223 px de largura; verificado em um render). Texto de parágrafo combox:[w,h]quebra linhas, mas a caixa CORTA linhas que não cabem em sua altura:box:[240,60]com tamanho 40 mostrou apenas "Hello" (a segunda linha foi cortada); portanto, faça a caixa alta o suficiente para cada linha (cerca de 1,3 × tamanho por linha). - Edições ripple falham em uma trilha sync-locked:
timeline.trimcommode:"ripple"respondeu "esta edição quebraria a sincronia: V2 está sync-locked e tem um clipe no caminho" quando um título estava em V2. Bloqueie/desbloqueie a outra trilha primeiro ou corte sem ripple. probe --image-sequenceaceita apenas imagens estáticas numeradas; em um filme, ele gera erro.effects.addKeyframeheadless com ummediaTimebruto não fez nada ({added:false, mediaTime:0}; 0.17.0), mas no aplicativo ao vivo{clip, effect:"opacity", param:"opacity", seconds:1.5, value:40}adicionou um (keyframes 5 → 6; o tempo snap para um quadro: 624699432000). Headless, mova o playhead e useeffects.toggleAnimation, ougraphics.set {"…","keyframe":true}para propriedades de título.mixer.addInsertprecisa de um id de efeito de áudio real (hard_limiter, deeffects.list {"kind":"Audio"}), não de um rótulo comovolume;mixer.addSendprecisa darefdo submix demixer.addSubmixna mesma execução.- Os comandos
graphics.*precisam de um título na mesma sessão: executegraphics.newTextprimeiro no mesmo script, depoisgraphics.alignFrame.*,nudge*,fontSize*,leading*funcionam headless (leiagraphics.list {clip}→layers[0]). Sem um, eles respondem "no graphic clip".graphics.deleteLayerfoi aceito apenas ao vivo (sem leitura). - A seleção não sobrevive a salvar/reabrir: coloque
project.select {items:[id]}/timeline.selectno mesmo script do comando que precisa dela ("select an item in the Project panel", "no clips selected"). - A exportação FCPXML pode perder um título:
file.exportInterchange {"format":"fcpxml"}relatou o clipe gráfico "not supported" enquanto ainda escrevia o arquivo; leia o relatório antes de confiar em uma exportação de intercâmbio. --demoabre o projeto de demonstração integrado: ele inspeciona e renderiza (um quadro 1920×1080 em 1 s), exportou bem apenas até onde foi testado; mídia ausente é exportada como quadros placeholder a menos que--allow-offlineos aceite.file.exportMediaaguarda seu arquivo a menos que"wait":false; a CLIexportsempre aguarda.
Verifique antes de relatar
inspect sequence (inícios/fins de clipe em quadros, trilhas, transições, efeitos), probe para a duração e codecs do arquivo exportado, e render um quadro nos momentos interessantes para inspecionar. Contagem de quadros: 3 s a 25 fps = 75 quadros; um ripple trim de -10 quadros resultou em 65.