Communitygithub.com

beachyphotoandfilm-arch/video-skills

Renderiza reels finalizados do DaVinci Resolve, escreve legendas na voz do criador, anexa capas personalizadas do Instagram a partir de 'reel-covers' e agenda para Instagram, TikTok e YouTube Shorts via Metricool. Gerencia o upload pelo Google Drive, verifica conflitos no calendário existente e faz a limpeza. Ative com 'agendar os reels', 'postar estes', 'colocar no calendário' ou após a aprovação dos reels.

O que é video-skills?

Esta skill automatiza o fluxo completo de publicação de reels para criadores de conteúdo que usam DaVinci Resolve e Metricool. Ela começa renderizando os reels com legendas diretamente do Resolve via API, depois faz o upload dos vídeos e capas personalizadas para o Google Drive, gerando URLs públicas para o Metricool. A skill também escreve legendas no tom de voz do criador, com formatação específica para CTAs de comentários ou conteúdo educativo. No agendamento, ela distribui um post por dia em todas as três plataformas (Instagram, TikTok e YouTube Shorts), evitando conflitos com posts existentes no calendário. Por fim, remove os arquivos temporários do Drive após a confirmação de que o Metricool os copiou. É ideal para criadores que produzem múltiplos reels e querem manter uma presença consistente sem gerenciamento manual.

Funciona com✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/beachyphotoandfilm-arch/video-skills/tree/HEAD/skills/schedule-social

Perguntar na sua IA favorita

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

Documentação

Agendar para Redes Sociais

Configuração: preencha estes campos

Substitua cada placeholder abaixo antes da primeira execução.

placeholdero que é
<YOUR_METRICOOL_BLOG_ID>O blogId da sua marca no Metricool (obtido de getBrandSettings)
<YOUR_TIMEZONE>Fuso horário IANA para agendamento, ex. America/Sao_Paulo
<YOUR_POST_TIME>Horário padrão de postagem diária, ex. 10:00
<YOUR_IG_HANDLE>, <YOUR_TIKTOK_HANDLE>, <YOUR_YOUTUBE_CHANNEL_ID>As contas conectadas no Metricool
<YOUR_DRIVE_UPLOAD_FOLDER_ID>Uma pasta do Google Drive compartilhada como "qualquer pessoa com o link" (veja o hop de mídia)
<YOUR_VIDEO_LIBRARY>Onde os arquivos finalizados são mantidos, ex. ~/Videos/Finalizados
<YOUR_STANDING_CTA>Linha de fechamento opcional que você coloca em toda legenda
<YOUR_VOICE_FILE>Opcional: caminho para um guia de voz/estilo para legendas

Marca: blogId <YOUR_METRICOOL_BLOG_ID>, fuso horário <YOUR_TIMEZONE>. Conectado: Instagram (<YOUR_IG_HANDLE>), TikTok (<YOUR_TIKTOK_HANDLE>), YouTube (<YOUR_YOUTUBE_CHANNEL_ID>).

O hop de mídia (a parte que não é óbvia)

A API do Metricool aceita apenas URLs públicas. Não aceita um arquivo local. A cadeia de funcionamento:

  1. Faça upload do MP4 para uma pasta do Drive, como Metricool Uploads (Claude) (<YOUR_DRIVE_UPLOAD_FOLDER_ID>). Compartilhe a pasta "qualquer pessoa com o link" uma vez; os arquivos herdam isso, então não é necessário compartilhar por arquivo.
    cd <dir com o arquivo> && gws drive files create \
      --params '{"uploadType":"multipart","supportsAllDrives":true}' \
      --json '{"name":"<nome>.mp4","mimeType":"video/mp4","parents":["<YOUR_DRIVE_UPLOAD_FOLDER_ID>"]}' \
      --upload "<arquivo>"
    
  2. Agende usando a URL de download direto: https://drive.google.com/uc?id=<fileId>&export=download. O link /view falha com "Falha ao normalizar mídia".
  3. O Metricool copia o arquivo para seu próprio armazenamento; o media da resposta muda para static.metricool.com/....
  4. Exclua a cópia do Drive assim que você ver isso. O armazenamento nunca se acumula.

Claude geralmente não pode tornar arquivos do Drive públicos (o sandbox bloqueia) e não pode editar suas próprias permissões. É por isso que a pasta compartilhada existe. Se um arquivo acabar fora da pasta, peça ao usuário para movê-lo, em vez de tentar compartilhá-lo.

Legendas

Se você mantém um guia de voz, leia <YOUR_VOICE_FILE> primeiro e combine com ele. Caso contrário, use estes padrões.

Quando o reel tem um CTA de palavra-chave de comentário (uma palavra-chave que aciona um DM ou e-mail automatizado), a linha 1 é o CTA:

  • Linha 1: Comente <PALAVRA-CHAVE> e eu enviarei <nome do recurso> grátis 👇, palavra-chave em maiúsculas, exatamente como falada no clipe de CTA do reel.
  • Depois a linha de gancho e as 2-4 linhas de ensino abaixo.
  • Feche com o CTA fixo, se você usar um.
  • A palavra-chave deve corresponder ao CTA falado no reel (reel_cta no arquivo de estado do vídeo). Uma palavra-chave por vídeo.

Formato para reels sem um CTA de palavra-chave:

  • Linha 1 é o gancho. É a única linha que aparece no feed. Geralmente a mesma linha com que o reel abre.
  • 2-4 linhas curtas que ensinam uma coisa. Quebras de linha entre elas, não um parágrafo.
  • Sem spam de hashtags. Poucas ou nenhuma.
  • Feche com <YOUR_STANDING_CTA> exatamente se você tiver um.

Escreva a partir do que está realmente no reel, usando as palavras do criador da transcrição, não conselhos genéricos. Curto, mas educativo: o espectador deve aprender uma coisa utilizável só com a legenda.

Exemplos genéricos do formato:

"Postar todo dia = ESCONDER O POTE / Postar 3 vídeos excelentes por semana = CRESCIMENTO"

"Dica rápida se você quer um áudio melhor: coloque o microfone mais perto, não aumente o ganho..."

Renderização

As legendas são incorporadas: video-reels as coloca na V3 como um clipe de sobreposição alpha, com o cartão de texto-gancho na V2. Nada para importar, nenhuma caixa de seleção de incorporação.

  1. O usuário corta o reel. Ambas as faixas de sobreposição são clipes independentes, então cortar a V1 não as move. Se o timing for recortado, re-renderize as legendas desse reel em vez de deslizá-las.
  2. Claude as renderiza através da API do Resolve. Quatro reels levam cerca de 90 segundos.
out = os.path.expanduser("~/Movies/<video>-deliverables/reels-final")
os.makedirs(out, exist_ok=True)
project.DeleteAllRenderJobs()
for i in range(project.GetTimelineCount()):
    t = project.GetTimelineByIndex(i+1)
    if not t.GetName().startswith("Reel"):
        continue
    project.SetCurrentTimeline(t)
    project.SetRenderSettings({"TargetDir": out, "CustomName": t.GetName().replace(" ", "_"),
                               "SelectAllFrames": True, "FormatWidth": 1080, "FormatHeight": 1920,
                               "ExportVideo": True, "ExportAudio": True})
    project.SetCurrentRenderFormatAndCodec("mp4", "H264")
    project.AddRenderJob()

Então start_rendering. A string do codec é "H264", não "H.264", e o formato é "mp4". Monitore o diretório de saída em vez do status do trabalho; os arquivos aparecem à medida que terminam. Espere ~40MB para 30 segundos. 3. A renderização é o ponto sem retorno para o timing, então faça qualquer corte primeiro. 4. Verifique a saída com ffmpeg antes de fazer upload, um quadro dentro da janela do gancho e um no meio do reel:

ffmpeg -v error -ss 1.5 -i reel.mp4 -frames:v 1 hook.png -y
ffmpeg -v error -ss 8   -i reel.mp4 -frames:v 1 cap.png  -y

Empilhe-os em uma única folha de prova e realmente olhe para ela. Este é o último lugar onde um cartão de gancho faltando ou uma faixa de legenda em branco pode ser detectado, e após o agendamento não há exclusão.

Para onde vão os arquivos finalizados

Tudo o que é mantido vai para <YOUR_VIDEO_LIBRARY>/, uma pasta por vídeo:

<YOUR_VIDEO_LIBRARY>/<Video> YYYY-MM-DD/
    Reels/              o que foi postado. 1080x1920 H.264
    Reels/Masters/      mesmo corte, arquivo de 60 Mbps
    Timelines/          um .drt por timeline + o projeto .drp
    Covers/             as capas de reel do Instagram aprovadas, 1080x1920 JPG
    Thumbnails/         as opções de tamanho completo
    YouTube/            o longa exportado, entrega + mestre
    Agenda de postagem.txt   o que sai, onde e quando

O arquivo de upload: tão alto quanto a API de publicação do Instagram permite

O Metricool posta através da API de publicação de conteúdo do Meta, que limita o que aceita. Faça upload do melhor arquivo que se encaixa dentro desses limites, feito a partir do mestre de 60 Mbps e não da renderização de entrega do Resolve:

  • H.264 High, yuv420p, 1080x1920, GOP fechado, moov na frente (+faststart)
  • vídeo no máximo 24 Mbps (o limite é 25), áudio AAC 128 kbps a 48 kHz (o Resolve escreve 320 kbps, que está acima)
  • apenas fluxos de vídeo e áudio. O Resolve adiciona uma faixa de dados de timecode; remova-a com -dn
ffmpeg -i "Masters/<n>.mp4" -map 0:v:0 -map 0:a:0 -map_metadata -1 -dn \
  -c:v libx264 -preset slow -crf 11 -maxrate 24M -bufsize 48M -pix_fmt yuv420p -profile:v high \
  -g 48 -keyint_min 48 -sc_threshold 0 -flags +cgop \
  -c:a aac -b:a 128k -ar 48000 -movflags +faststart "Reels/<n>.mp4"

No CRF 16, imagens de cabeça falante usavam apenas ~8 Mbps, então CRF 11 gasta mais do orçamento. Execute em segundo plano, já que vários reels levam minutos em -preset slow. Codifique um arquivo de cada vez, não em paralelo: muitas codificações paralelas podem encher o disco no meio da escrita e truncar todos os arquivos. O Instagram ainda re-comprime do seu lado; isso garante que o que ele começa seja o mais limpo possível.

Duas renderizações por reel, não uma. Mesmo codec, mesma resolução, taxa de bits diferente:

resoluçãotaxa de bitspara
entrega1080x1920 H.264Passagem do Resolve, depois substituída pelo arquivo de upload acimaupload
mestre1080x1920 H.26460 Mbps via "VideoQuality": 60000arquivo

Mesmas duas passagens para o longa em 1920x1080: ~900MB de entrega, ~4.5GB mestre para um vídeo de 10 minutos.

1080x1920 é a resolução correta: o Instagram serve 1080 de largura independentemente, e o corte do reel já está superamostrado a partir de 4K. Não ofereça ProRes ou um quadro maior a menos que solicitado.

VideoQuality é pegajoso. Defina-o em cada passagem.

As configurações de renderização ficam no projeto, não no trabalho. Deixe VideoQuality fora de uma chamada SetRenderSettings e a renderização reutiliza silenciosamente o que a anterior usou. Uma passagem de entrega de longa que herda 60000 dos mestres de reel sai ~5x maior do que o pretendido.

project.SetRenderSettings({..., "VideoQuality": 12000})   # entrega, ~12 Mbps
project.SetRenderSettings({..., "VideoQuality": 60000})   # mestre,  ~60 Mbps

Nunca confie no padrão para a passagem de entrega. E nunca confie na listagem de trabalhos: VideoQuality retorna como None de GetRenderJobList() mesmo quando foi aplicado. Verifique o arquivo finalizado:

ffprobe -v error -select_streams v:0 -show_entries stream=bit_rate -of csv=p=0 out.mp4

Verifique o espaço livre antes de enfileirar um par de longa. Um mestre de 10 minutos a 60 Mbps é ~4.5GB.

Exporte também as timelines para a pasta, para que a edição seja portátil sem o banco de dados do projeto:

for i in range(project.GetTimelineCount()):
    t = project.GetTimelineByIndex(i+1)
    t.Export(os.path.join(d, t.GetName() + ".drt"), resolve.EXPORT_DRT)
resolve.GetProjectManager().ExportProject(project.GetName(), os.path.join(d, project.GetName() + ".drp"))
  • Renderize diretamente nela. Defina o TargetDir do Resolve para <essa pasta>/Reels, para que nada precise ser movido depois.
  • Renomeie a partir dos nomes das timelines do Resolve. Reel_2_-_my_best_tip.mp4 vira 2. my best tip.mp4: numerado para ordenar, legível de relance. Mesmos nomes para os mestres e arquivos .drt, para que as três pastas se alinhem.
  • Mova, não copie. ~/Movies/<video>-* contém arquivos de trabalho (JSON do whisper, SRTs, movs de sobreposição, movs de legenda). Eles ficam no lugar para re-renderizações; as exportações finalizadas saem.
  • Escreva Agenda de postagem.txt após o agendamento, listando a data, hora e redes de cada reel, para que o usuário possa ver o que já saiu sem abrir o Metricool.

Mencione espaço em disco apenas se uma renderização falhar por falta de espaço, ou se um par de longa claramente não couber.

Capas (apenas Instagram)

Cada reel recebe uma capa personalizada do Instagram antes de ser agendado. Execute a skill reel-covers após as legendas serem aprovadas e antes de agendar. Ela retorna um JPG aprovado por reel em <Video>/Covers/. Mostre as capas no mesmo momento que as legendas e os slots, para que tudo seja aprovado em uma passagem.

Faça upload de cada capa através do mesmo hop do Drive que o vídeo (mesma pasta <YOUR_DRIVE_UPLOAD_FOLDER_ID>, mimeType: image/jpeg) e passe-a como videoThumbnailUrl usando o formulário uc?id=...&export=download. Exclua a cópia do Drive assim que o Metricool tiver sua própria cópia, o mesmo que com o vídeo.

Agendamento

Uma postagem por reel, todas as três redes, capa incluída. A capa só importa no Instagram. O TikTok a ignora em uma conta pessoal, e o Shorts só a mostra em um canal verificado. Não divida a postagem.

"providers":[{"network":"instagram"},{"network":"tiktok"},{"network":"youtube"}],
"media":["https://drive.google.com/uc?id=<id do video>&export=download"],
"videoThumbnailUrl":"https://drive.google.com/uc?id=<id da capa>&export=download",
"instagramData":{"type":"REEL","showReelOnFeed":true,"isAiGenerated":false},
"tiktokData":{"privacyOption":"PUBLIC_TO_EVERYONE","title":"<titulo curto>"},
"youtubeData":{"type":"short","privacy":"public","madeForKids":false,"title":"<titulo, <100 chars>"}
  • Adicionar uma capa a uma postagem já agendada: updateScheduledPost com os campos originais completos da postagem (texto, provedores, mídia, todos os dados de rede, data) mais videoThumbnailUrl. Ele sobrescreve e não tem desfazer, então copie os campos de getScheduledPosts exatamente. Nunca substitua um videoThumbnailUrl ou videoCoverMilliseconds existente: uma postagem que tem qualquer um deles já tem uma capa escolhida.
  • Se uma atualização falhar com "Falha ao normalizar mídia" enquanto outras funcionaram, a busca do Drive falhou dessa vez. A postagem permanece inalterada. Faça upload do arquivo novamente (novo id) e tente novamente. Tentar a mesma URL não ajudará.
  • Em seguida, verifique com getScheduledPosts que o videoThumbnailUrl de cada postagem agora começa com static.metricool.com e exclua as cópias do Drive.
  • O YouTube requer um título e madeForKids. O TikTok quer um título curto.
  • autoPublish: true permite que o Metricool o publique automaticamente.

Quando agendar (regra padrão, ajuste a gosto)

Comece no dia seguinte ao de hoje. Uma postagem por dia. Se um dia já tiver conteúdo, passe para o próximo dia livre.

dia = amanhã
para cada postagem em ordem:
    enquanto dia já tem uma postagem agendada:  dia += 1
    agende às <YOUR_POST_TIME> local no dia
    dia += 1
  • <YOUR_POST_TIME> em <YOUR_TIMEZONE> é o horário de postagem padrão.
  • Sempre chame getScheduledPosts primeiro, cobrindo amanhã até amanhã + (número de postagens + 14 dias), para que você possa ver as lacunas. Pular essa verificação pode colocar uma postagem em um slot já ocupado.
  • Um dia conta como ocupado se qualquer coisa estiver agendada naquele dia, rascunhos incluídos.
  • Não agrupe várias postagens em um dia e não deixe buracos: o objetivo é uma execução diária constante começando imediatamente.
  • Nunca coloque um rótulo de teste no texto da legenda. Nada de "RASCUNHO DE TESTE", nada de "seguro excluir". A legenda é a cópia finalizada, sempre, mesmo em uma execução de teste; o usuário pode querer mantê-la. Marque postagens de teste com draft: true + autoPublish: false (rascunhos são visualmente distintos no planejador) e entregue o plannerUrl mais o id da postagem para que possa ser excluída em um clique.

YouTube longa (o vídeo principal, não um Short)

Recomendado: não envie arquivos grandes de longa através do Metricool. Faça upload no YouTube Studio. Uma exportação de ~1GB enviada através do Metricool pode ser armazenada truncada no meio da transferência. O Resolve coloca o índice MP4 (moov) no final do arquivo, então uma cópia truncada é ilegível, e o YouTube relata "processamento abandonado" depois que já "publicou". O Metricool pode não relatar um erro. Entregue ao usuário o arquivo, título, descrição e miniatura para colar no Studio, renderizado em 4K (o Studio não tem problema de tamanho). Tudo abaixo é mantido para referência.

Se o Metricool for usado para um arquivo grande, verifique o armazenamento...

[truncado para tradução]

Individual skills in this repo

This repo contains 7 individual skills — each has its own dedicated page.

beachyphotoandfilm-arch/video-skills

Sync camera footage to a separate lapel or field-recorder track (e.g. Tascam DR-10L and similar) and lay it up in DaVinci Resolve. Stitches the recorder's split files, finds each clip's exact place in the audio by matching words then waveforms, cuts one lapel slice per clip so every later skill works unchanged, checks for clipping, and builds a synced timeline in a new Resolve project. Trigger on "sync the lapel", "sync my audio", "line up the recorder", "I used a lav", or any shoot with a separate audio folder (live talks, events, workshops). Run it before paper-edit or video-reels.

beachyphotoandfilm-arch/video-skills

Turn raw talking-head footage into an assembled rough cut inside DaVinci Resolve. Pulls the clips off your footage drive, transcribes them locally, removes failed takes, restarts, asides and dead air, then creates a new Resolve project with two paper-edit timelines ready for your fine trim. Trigger on "paper edit", "cut my raw footage", "make a rough cut", "clean up this video", or when the user points at a folder of raw camera files for a YouTube video.

beachyphotoandfilm-arch/video-skills

Design a unique Instagram cover for each reel in your house style. Reads what the reel is about, writes a short hook headline, picks one of your own photos from a tagged photo library, lays it out like your existing covers, and proofs it in grid view at phone size. Renders locally, never with AI image generation. Can be called by a scheduling skill before reels are scheduled. Trigger on "make covers", "reel covers", "cover photo for this reel", "design the IG covers".

beachyphotoandfilm-arch/video-skills

Build animated brand overlays (motion graphics) for a talking-head video, timed to the speaker's exact words, plus a DaVinci Resolve import file. House style is in-scene type (text beside and behind the speaker's head) plus diagrams. Transcribes the rough cut locally, picks the moments, renders transparent .mov clips, and writes an FCPXML that drops every clip onto the timeline already in position. Trigger on "make animations for this video", "add overlays/motion graphics", "animate this", "b-roll graphics for my YouTube video", or when the user shares a rough cut and asks for graphics.

beachyphotoandfilm-arch/video-skills

Cut vertical Instagram reels out of a long-form talking-head video, hook first. Picks the strongest standalone moments from the transcript, opens each reel on its punchiest line, builds vertical timelines in DaVinci Resolve framed on the speaker's face with the LUT applied, and finishes them: a hook (a held text card, or a word-by-word "build" hook with punch-in) and burned-look captions on V3; this-or-that reels get product graphics and a comment-keyword CTA card. You trim and render, nothing to import. Trigger on "make reels", "clip this for Instagram", "cut some verticals", or after a YouTube video is cut.

beachyphotoandfilm-arch/video-skills

Design YouTube thumbnails and titles for a talking-head video. Pulls graded full-res frames out of the raw footage, renders brand-styled variants in two proven layouts, and proofs them at phone size where the click actually gets decided. Trigger on "make thumbnails", "thumbnail for this video", "title and thumbnail", or after a video is cut.

beachyphotoandfilm-arch/video-skills

Run the whole YouTube video pipeline end to end, one stage at a time, stopping for the creator's approval at every gate. Paper edit, punch-ins, reels, reel covers, scheduling the reels, overlays, thumbnail and title, then scheduling the long-form video, all through Metricool. Keeps state per video so you can stop anywhere and pick up later. Trigger on "/youtube", "let's do the whole video", "run the video pipeline", "continue the <name> video", or when handed raw footage for a YouTube video.

Habilidades Relacionadas