Communitygithub.com

youtube-publish

Sube vídeos terminados o Shorts a YouTube de forma segura desde la terminal.

¿Qué es youtube-publish?

Este skill permite a un agente de IA (como Claude Code, Cursor o Codex) subir vídeos y Shorts a YouTube utilizando la API de datos v3, sin depender de SDK (usa `fetch` plano y carga reanudable por fragmentos). Está diseñado para lotes: por defecto sube los vídeos como privados, lleva un registro con SHA256 para evitar dobles publicaciones, incluye validación de metadatos, simulación en seco y control de cuota. El agente debe guiar al usuario en la configuración única (crear proyecto en Google Cloud, habilitar la API, crear un cliente OAuth de tipo aplicación de escritorio) y luego usar los scripts `auth.mjs` y `upload.mjs` para autorizar el canal y subir archivos. El skill protege la privacidad: nunca imprime ni registra tokens o secretos, por defecto los vídeos son privados, y rechaza la visibilidad pública a menos que el usuario lo solicite explícitamente y se pase la bandera `--allow-public`. La cuota diaria (10.000 unidades, ~6 subidas) se administra con `--max-uploads` y `--units-per-upload`.

Compatible con~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/zaddy99999/video-editing-skills/tree/main/skills/youtube-publish

Preguntar en tu IA favorita

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

Documentación

¿Qué hace youtube-publish?

Cargador de la API de datos v3 de YouTube sin dependencia de SDK (usando fetch simple, carga reanudable por fragmentos). Construido para lotes: privado por defecto, un registro SHA256 para que una re-ejecución nunca duplique publicaciones, validación de metadatos, simulación en seco y control de cuota.

Configuración única (la realiza el usuario, no el agente)

  1. Consola de Google Cloud: crea un proyecto, habilita la API de datos v3 de YouTube, crea un ID de cliente OAuth de tipo Aplicación de escritorio.
  2. Proporciona el cliente a los scripts sin versionarlo: export YOUTUBE_CLIENT_ID=... YOUTUBE_CLIENT_SECRET=... (o guarda el JSON descargado fuera del repositorio y pasa --client-secrets).
  3. Autoriza el canal una vez:
    node scripts/auth.mjs --token-file .youtube-token.json
    
    Abre la página de consentimiento, captura la redirección en 127.0.0.1 (PKCE + verificación de estado), almacena el token de actualización con modo 600. El token nunca se imprime.

Flujo de trabajo

# 1. Simulación en seco: valida metadatos, hashea archivos, muestra plan de subida/saltos y costo de cuota
node scripts/upload.mjs --jobs jobs.json --dry-run

# 2. Subida (privada por defecto)
node scripts/upload.mjs --jobs jobs.json --token-file .youtube-token.json

# Archivo único
node scripts/upload.mjs --file publish/short.mp4 --title "Cómo automaticé mis ediciones" --tags shorts,automation --privacy unlisted

jobs.json:

[
  { "file": "publish/short-01.mp4", "title": "...", "description": "...", "tags": ["shorts"], "privacy": "private" },
  { "file": "publish/short-02.mp4", "title": "...", "privacy": "private", "publishAt": "2026-11-01T17:00:00Z" }
]

Las rutas de archivo relativas se resuelven contra la carpeta del archivo de trabajos.

Reglas

  • Solo subir archivos que hayan pasado render-qc y hayan sido aprobados por el usuario.
  • La privacidad por defecto es private. public es rechazado a menos que el usuario lo solicite explícitamente y pases --allow-public. Los vídeos programados (publishAt) deben ser private; YouTube los cambia a público en ese momento.
  • Siempre ejecuta --dry-run primero y muestra el plan al usuario.
  • Nunca imprimas, registres o subas tokens, secretos de cliente, archivos .env* o el registro. El .gitignore del repositorio cubre *token*.json, *credentials*.json, *client_secret*.json, .env* y *ledger*.json.
  • El registro (.youtube-upload-ledger.json) es la fuente de verdad de lo que se ha publicado. Se guarda después de cada subida individual. No lo elimines para "reintentar"; usa --force-duplicate solo si el usuario realmente quiere una segunda copia.
  • Cuota: un proyecto obtiene 10.000 unidades/día por defecto y una subida históricamente ha costado 1.600 unidades (unas 6 subidas/día). --max-uploads (por defecto 6) detiene una ejecución antes de agotar la cuota; --units-per-upload ajusta la estimación si Google cambia el costo. En caso de quotaExceeded, la ejecución se detiene y los trabajos restantes pueden re-ejecutarse al día siguiente (el registro salta los ya realizados).
  • Títulos: sin marcadores de posición (TODO, sin título, {{...}}), máximo 100 caracteres, sin < o >. Las etiquetas tienen un máximo total de 500 caracteres. La validación lo exige.
  • Los proyectos de API no verificados pueden forzar las subidas a privado hasta que Google audite la aplicación; informa al usuario si cada subida resulta privada.

Verificar

Cada resultado tiene un videoId (abre https://youtu.be/<id> mientras aún sea privado) o una razón skipped. node scripts/upload.mjs --check-auth prueba las credenciales sin subir.

Individual skills in this repo

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

Skills relacionados