Communitygithub.com

beachyphotoandfilm-arch/video-skills

Renderiza reels finalizados desde DaVinci Resolve, escribe pies de foto con la voz del creador, adjunta una portada personalizada de Instagram desde reel-covers, y los programa en Instagram, TikTok y YouTube Shorts a través de Metricool. Maneja la subida a Drive, comprueba conflictos con el calendario existente y limpia los archivos. Actívalo con frases como 'programa los reels', 'publícalos', 'ponlos en el calendario', o después de que los reels estén aprobados.

¿Qué es video-skills?

Esta skill automatiza el flujo completo de publicación de reels en redes sociales, desde la renderización en DaVinci Resolve hasta la programación en Instagram, TikTok y YouTube Shorts usando Metricool como intermediario. El proceso comienza con la renderización de los reels desde Resolve, incluyendo la quema de pies de foto y tarjetas de gancho. Luego, los videos se suben a una carpeta compartida de Google Drive (el 'salto de medios'), ya que la API de Metricool solo acepta URLs públicas. Después, la skill escribe pies de foto en el tono del creador, siguiendo una guía de voz o plantillas predefinidas, y genera portadas personalizadas para Instagram usando el skill 'reel-covers'. Finalmente, programa cada reel en las tres plataformas, detectando automáticamente espacios libres en el calendario para evitar superposiciones, y limpia los archivos temporales de Drive. La skill está diseñada para Claude Code o asistentes similares que puedan ejecutar scripts de Python, bash y comandos de Google Drive y Metricool, y requiere configuración previa de placeholders como IDs de Metricool, zona horaria y carpetas de Drive.

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

Preguntar en tu IA favorita

Abre un nuevo chat con esta habilidad de agente ya precargada.

Documentación

Programar en redes sociales

Configuración: completa estos datos

Reemplaza cada marcador de posición a continuación antes de la primera ejecución.

MarcadorQué es
<YOUR_METRICOOL_BLOG_ID>El blogId de tu marca en Metricool (de getBrandSettings)
<YOUR_TIMEZONE>Zona horaria IANA para la programación, ej. America/Chicago
<YOUR_POST_TIME>Hora de publicación diaria predeterminada, ej. 10:00
<YOUR_IG_HANDLE>, <YOUR_TIKTOK_HANDLE>, <YOUR_YOUTUBE_CHANNEL_ID>Las cuentas conectadas en Metricool
<YOUR_DRIVE_UPLOAD_FOLDER_ID>Una carpeta de Google Drive compartida con 'cualquier persona con el enlace' (ver el salto de medios)
<YOUR_VIDEO_LIBRARY>Donde se guardan los archivos terminados, ej. ~/Videos/Finished
<YOUR_STANDING_CTA>Línea de cierre opcional que pones en cada pie de foto
<YOUR_VOICE_FILE>Opcional: ruta a un archivo de voz/guía de estilo para los pies de foto

Marca: blogId <YOUR_METRICOOL_BLOG_ID>, zona horaria <YOUR_TIMEZONE>. Conectado: Instagram (<YOUR_IG_HANDLE>), TikTok (<YOUR_TIKTOK_HANDLE>), YouTube (<YOUR_YOUTUBE_CHANNEL_ID>).

El salto de medios (la parte que no es obvia)

La API de Metricool solo acepta URLs públicas. No puede aceptar un archivo local. La cadena de trabajo:

  1. Sube el MP4 a una carpeta de Drive como Metricool Uploads (Claude) (<YOUR_DRIVE_UPLOAD_FOLDER_ID>). Comparte la carpeta con 'cualquier persona con el enlace' una vez; los archivos heredan eso, así que no es necesario compartir por archivo.
    cd <directorio con el archivo> && gws drive files create \
      --params '{"uploadType":"multipart","supportsAllDrives":true}' \
      --json '{"name":"<nombre>.mp4","mimeType":"video/mp4","parents":["<YOUR_DRIVE_UPLOAD_FOLDER_ID>"]}' \
      --upload "<archivo>"
    
  2. Programa con la URL de descarga directa: https://drive.google.com/uc?id=<fileId>&export=download. El enlace /view falla con 'Error al normalizar el medio'.
  3. Metricool copia el archivo a su propio almacenamiento; el media de la respuesta cambia a static.metricool.com/....
  4. Elimina la copia de Drive una vez que veas eso. El almacenamiento nunca se acumula.

Claude normalmente no puede hacer públicos los archivos de Drive (el sandbox lo bloquea) y no puede editar sus propios permisos. Por eso existe la carpeta compartida. Si un archivo termina fuera de la carpeta, pide al usuario que lo mueva en lugar de intentar compartirlo.

Pies de foto

Si mantienes una guía de voz, lee primero <YOUR_VOICE_FILE> y ajústate a ella. De lo contrario, usa estos valores predeterminados.

Cuando el reel tiene un CTA de palabra clave en comentarios (una palabra clave que activa un DM o correo automatizado), la línea 1 es el CTA:

  • Línea 1: Comenta <KEYWORD> y te enviaré <nombre del recurso> gratis 👇, palabra clave en mayúsculas, exactamente como se habla en el clip del CTA del reel.
  • Luego la línea de gancho y las 2-4 líneas de enseñanza a continuación.
  • Cierra con el CTA fijo, si lo usas.
  • La palabra clave debe coincidir con el CTA hablado del reel (reel_cta en el archivo de estado del video). Una palabra clave por video.

Formato para reels sin un CTA de palabra clave:

  • La línea 1 es el gancho. Es la única línea que se muestra en el feed. Generalmente la misma línea con la que abre el reel.
  • 2-4 líneas cortas que enseñan una cosa. Saltos de línea entre ellas, no un párrafo.
  • Sin spam de hashtags. Pocos o ninguno.
  • Cierra con <YOUR_STANDING_CTA> textualmente si lo tienes.

Escribe basándote en lo que realmente está en el reel, usando las palabras del creador de la transcripción, no consejos genéricos. Corto pero educativo: el espectador debe aprender algo utilizable solo con el pie de foto.

Ejemplos genéricos de la forma:

'Publicar todos los días = AGOTAMIENTO / Publicar 3 buenos videos a la semana = CRECIMIENTO'

'Consejo rápido si quieres mejor audio: pon el micrófono más cerca, no subas la ganancia...'

Renderización

Los pies de foto se queman: video-reels los coloca en V3 como un clip de superposición alfa, con la tarjeta de texto de gancho en V2. Nada que importar, sin casilla de verificación de quemado.

  1. El usuario recorta el reel. Ambas pistas de superposición son clips independientes, por lo que recortar V1 no las mueve. Si el tiempo se re-corta, vuelve a renderizar los pies de foto de ese reel en lugar de deslizarlos.
  2. Claude los renderiza a través de la API de Resolve. Cuatro reels tardan unos 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()

Luego start_rendering. La cadena del códec es "H264", no "H.264", y el formato es "mp4". Consulta el directorio de salida en lugar del estado del trabajo; los archivos aparecen cuando terminan. Espera unos ~40MB para 30 segundos. 3. La renderización es el punto de no retorno para el tiempo, así que haz cualquier recorte primero. 4. Verifica la salida con ffmpeg antes de subir, un fotograma dentro de la ventana del gancho y otro a mitad del 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

Apílelos en una sola hoja de prueba y mírala realmente. Este es el último lugar donde se puede detectar una tarjeta de gancho faltante o una pista de pie de foto vacía, y después de la programación no hay eliminación.

Dónde van los archivos terminados

Todo lo que se guarda termina en <YOUR_VIDEO_LIBRARY>/, una carpeta por video:

<YOUR_VIDEO_LIBRARY>/<Video> YYYY-MM-DD/
    Reels/              lo que se publicó. 1080x1920 H.264
    Reels/Masters/      mismo corte, archivo de 60 Mbps
    Timelines/          un .drt por timeline + el proyecto .drp
    Covers/             las portadas de reel de Instagram aprobadas, 1080x1920 JPG
    Thumbnails/         las opciones de tamaño completo
    YouTube/            el video largo exportado, entrega + archivo
    Posting schedule.txt   qué sale, dónde y cuándo

El archivo de subida: tan alto como lo permite la API de publicación de Instagram

Metricool publica a través de la API de publicación de contenido de Meta, que limita lo que acepta. Sube el mejor archivo que quepa dentro de esos límites, creado a partir del archivo maestro de 60 Mbps y no de la renderización de entrega de Resolve:

  • H.264 High, yuv420p, 1080x1920, GOP cerrado, moov al principio (+faststart)
  • video 24 Mbps máximo (el límite es 25), audio AAC 128 kbps a 48 kHz (Resolve escribe 320 kbps, que está por encima)
  • solo flujos de video y audio. Resolve añade una pista de datos de código de tiempo; elimínala con -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"

Con CRF 16, el metraje de solo cabeza parlante solo usó ~8 Mbps, por lo que CRF 11 gasta más del presupuesto. Ejecútalo en segundo plano, ya que varios reels tardan minutos en -preset slow. Codifica un archivo a la vez, no en paralelo: muchas codificaciones paralelas pueden llenar el disco a mitad de escritura y truncar todos los archivos. Instagram aún re-comprime por su lado; esto asegura que lo que comienza sea tan limpio como lo permite.

Dos renderizados por reel, no uno. Mismo códec, misma resolución, diferente tasa de bits:

ResoluciónTasa de bitsPara
entrega1080x1920 H.264Pase de Resolve, luego reemplazado por el archivo de subida anteriorsubir
maestro1080x1920 H.26460 Mbps mediante "VideoQuality": 60000archivo

Mismos dos pases para el video largo a 1920x1080: ~900MB de entrega, ~4.5GB de maestro para un video de 10 minutos.

1080x1920 es la resolución correcta: Instagram sirve 1080 de ancho independientemente, y el recorte del reel ya está sobremuestreado desde 4K. No ofrezcas ProRes o un fotograma más grande a menos que te lo pidan.

VideoQuality es persistente. Establécelo en cada pase.

La configuración de renderizado reside en el proyecto, no en el trabajo. Si omites VideoQuality en una llamada a SetRenderSettings, el renderizado reutiliza silenciosamente el que se usó antes. Un pase de entrega de video largo que herede 60000 de los maestros de reel sale ~5 veces más grande de lo previsto.

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

Nunca confíes en el valor predeterminado para el pase de entrega. Y nunca confíes en la lista de trabajos: VideoQuality se lee como None desde GetRenderJobList() incluso cuando se aplicó. Verifica el archivo terminado:

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

Verifica el espacio libre antes de encolar un par de video largo. Un maestro de 10 minutos a 60 Mbps es ~4.5GB.

Exporta también las líneas de tiempo a la carpeta, para que la edición sea portátil sin la base de datos del proyecto:

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"))
  • Renderiza directamente en ella. Establece el TargetDir de Resolve en <esa carpeta>/Reels, para que no haya que mover nada después.
  • Renombra según los nombres de las líneas de tiempo de Resolve. Reel_2_-_my_best_tip.mp4 se convierte en 2. my best tip.mp4: numerados para que se ordenen, legibles de un vistazo. Mismos nombres para los maestros y los archivos .drt, para que las tres carpetas coincidan.
  • Mueve, no copies. ~/Movies/<video>-* contiene archivos de trabajo (whisper JSON, SRTs, overlay movs, caption movs). Esos se quedan para re-renderizados; las exportaciones terminadas se van.
  • Escribe Posting schedule.txt después de la programación, listando la fecha, hora y redes de cada reel, para que el usuario pueda ver lo que ya se ha publicado sin abrir Metricool.

Menciona el espacio en disco solo si un renderizado realmente falla por espacio, o si un par de video largo claramente no cabe.

Portadas (solo Instagram)

Cada reel recibe una portada personalizada de Instagram antes de programarse. Ejecuta el skill reel-covers después de que los pies de foto estén aprobados y antes de programar. Devuelve un JPG aprobado por reel en <Video>/Covers/. Muestra las portadas en la misma compuerta que los pies de foto y los espacios, para que todo se apruebe de una vez.

Sube cada portada a través del mismo salto de Drive que el video (misma carpeta <YOUR_DRIVE_UPLOAD_FOLDER_ID>, mimeType: image/jpeg), y pásala como videoThumbnailUrl usando la forma uc?id=...&export=download. Elimina la copia de Drive una vez que Metricool tenga su propia copia, igual que con el video.

Programación

Una publicación por reel, las tres redes, portada incluida. La portada solo importa en Instagram. TikTok la ignora en una cuenta personal, y Shorts solo la muestra en un canal verificado. No dividas la publicación.

"providers":[{"network":"instagram"},{"network":"tiktok"},{"network":"youtube"}],
"media":["https://drive.google.com/uc?id=<video id>&export=download"],
"videoThumbnailUrl":"https://drive.google.com/uc?id=<cover id>&export=download",
"instagramData":{"type":"REEL","showReelOnFeed":true,"isAiGenerated":false},
"tiktokData":{"privacyOption":"PUBLIC_TO_EVERYONE","title":"<título corto>"},
"youtubeData":{"type":"short","privacy":"public","madeForKids":false,"title":"<título, <100 caracteres>"}
  • Agregar una portada a una publicación ya programada: updateScheduledPost con todos los campos originales de la publicación (texto, proveedores, medios, todos los datos de la red, fecha) más videoThumbnailUrl. Sobrescribe y no tiene deshacer, así que copia los campos de getScheduledPosts textualmente. Nunca reemplaces un videoThumbnailUrl o videoCoverMilliseconds existente: una publicación que tenga cualquiera de ellos ya tiene una portada elegida.
  • Si una actualización falla con 'Error al normalizar el medio' mientras que las otras funcionaron, la obtención de Drive falló esa vez. La publicación queda sin cambios. Vuelve a subir el archivo (nuevo id) y reintenta. Reintentar la misma URL no ayudará.
  • Luego verifica con getScheduledPosts que cada videoThumbnailUrl de la publicación comience ahora con static.metricool.com, y elimina las copias de Drive.
  • YouTube requiere un título y madeForKids. TikTok quiere un título corto.
  • autoPublish: true permite que Metricool lo publique automáticamente.

Cuándo programar (regla predeterminada, ajústala al gusto)

Empieza el día después de hoy. Una publicación por día. Si un día ya tiene contenido, pasa al siguiente día libre.

día = mañana
para cada publicación en orden:
    mientras el día ya tenga una publicación programada:  día += 1
    programa a <YOUR_POST_TIME> hora local en ese día
    día += 1
  • <YOUR_POST_TIME> en <YOUR_TIMEZONE> es la hora de publicación predeterminada.
  • Siempre llama a getScheduledPosts primero, cubriendo desde mañana hasta mañana + (número de publicaciones + 14 días), para que puedas ver los espacios. Saltarse esta verificación puede colocar una publicación en un espacio ya ocupado.
  • Un día cuenta como ocupado si cualquier cosa está programada ese día, incluidos los borradores.
  • No acumules varias publicaciones en un día y no dejes huecos: el objetivo es una ejecución diaria constante que comience de inmediato.
  • Nunca pongas una etiqueta de prueba en el texto del pie de foto. Sin 'BORRADOR DE PRUEBA', sin 'seguro de eliminar'. El pie de foto es la copia final, siempre, incluso en una prueba; el usuario puede querer conservarlo. Marca las publicaciones de prueba con draft: true + autoPublish: false (los borradores son visualmente distintos en el planificador) y entrega el plannerUrl más el id de la publicación para que se pueda eliminar con un clic.

YouTube de formato largo (el video principal, no un Short)

Recomendado: no envíes archivos grandes de formato largo a través de Metricool. Súbelos en YouTube Studio. Una exportación de ~1GB enviada a través de Metricool puede almacenarse truncada a mitad de la transferencia. Resolve coloca el índice MP4 (moov) al final del archivo, por lo que una copia truncada es ilegible, y YouTube informa 'procesamiento abandonado' después de que ya ha 'publicado'. Metricool puede no informar un error. Entrega al usuario el archivo, título, descripción y miniatura para pegarlos en Studio, renderizado en 4K (Studio no tiene problemas de tamaño). Todo lo siguiente se mantiene como referencia.

Si se usa Metricool para un archivo grande, verifica el archivo almacenado en su almacenamiento antes de publicarlo.

...

[truncado para la traducción]

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.

Skills relacionados