Exportar archivos a YouTube desde la línea de comandos
Automatizar tus subidas a YouTube puede ahorrarte un tiempo considerable. En este tutorial aprenderás a aprovechar youtubeuploader, una moderna herramienta de CLI basada en Go, para gestionar de forma eficiente tu flujo de trabajo de publicación de videos desde la línea de comandos.
Limitaciones importantes de la API de YouTube
Antes de pasar a la implementación, ten en cuenta estas restricciones críticas que impone la API de YouTube:
- Los proyectos nuevos de la API solo pueden subir videos privados hasta que Google los verifique.
- Revisa la cuota de tu proyecto y los límites de subida de video vigentes. Esperar entre subidas no repone una cuota diaria.
- Las credenciales de OAuth 2.0 deben estar configuradas correctamente.
- Las apps sin verificar requieren añadir usuarios de prueba en la pantalla de consentimiento de OAuth.
Instalar youtubeuploader
Descarga e instala el binario precompilado de youtubeuploader para tu plataforma:
# For Linux 64-bit
wget https://github.com/porjo/youtubeuploader/releases/download/v1.24.4/youtubeuploader_1.24.4_Linux_amd64.tar.gz
tar xf youtubeuploader_1.24.4_Linux_amd64.tar.gz
# For macOS on Intel (use Darwin_arm64 for Apple silicon)
wget https://github.com/porjo/youtubeuploader/releases/download/v1.24.4/youtubeuploader_1.24.4_Darwin_amd64.tar.gz
tar xf youtubeuploader_1.24.4_Darwin_amd64.tar.gz
Si usas Windows, descarga el archivo zip correspondiente desde la página de versiones y extráelo.
Extrae el contenido del archivo descargado en un directorio nuevo y coloca el binario en un directorio de tu PATH para los
comandos siguientes, o invócalo como ./youtubeuploader. Ejecuta youtubeuploader -version para verificar
la versión 1.24.4. Mantén client_secrets.json y el request.token generado en privado y fuera de Git.
Configurar la autenticación OAuth
Configura las credenciales de OAuth 2.0 siguiendo estos pasos:
- Ve a la Google Cloud Console.
- Crea un proyecto nuevo o selecciona uno existente.
- Ve a APIs y servicios y habilita la YouTube Data API v3.
- Configura la pantalla de consentimiento de OAuth: define el nombre de tu aplicación, el email de soporte, los scopes necesarios y añade usuarios de prueba (para apps sin verificar).
- Crea credenciales de OAuth: selecciona el tipo «Aplicación web» y añade
http://localhost:8080/oauth2callbackcomo URI de redirección autorizado. - Descarga el archivo
client_secrets.jsonresultante y colócalo en tu directorio de trabajo.
Comandos básicos de subida
A continuación tienes ejemplos prácticos para subir videos con youtubeuploader:
# Simple video upload
youtubeuploader -filename video.mp4 -title "My Video"
# Upload with metadata from parameters and a JSON file
youtubeuploader -filename video.mp4 \
-title "My Video" \
-description "Video description" \
-privacy "private" \
-tags "tag1,tag2" \
-metaJSON metadata.json
# Upload with rate limiting (1000 kbps)
youtubeuploader -filename video.mp4 \
-title "My Video" \
-ratelimit 1000
Gestionar los metadatos de video
Crea un archivo metadata.json para especificar información completa del video:
{
"title": "My Video",
"description": "Video description\nWith multiple lines",
"tags": ["tag1", "tag2"],
"privacyStatus": "private",
"madeForKids": false,
"embeddable": true,
"license": "creativeCommon",
"publicStatsViewable": true,
"categoryId": "22",
"recordingdate": "2024-02-05"
}
Sube el video con sus metadatos ejecutando:
youtubeuploader -filename video.mp4 -metaJSON metadata.json
Script de subida por lotes
El siguiente script de Bash sube de forma secuencial los archivos ya finalizados y se detiene ante
el primer fallo. El JSON de metadatos tiene prioridad sobre los metadatos de la línea de comandos,
así que define privacyStatus de forma deliberada en cada archivo.
Después de un fallo de red ambiguo, comprueba si YouTube recibió la subida antes de reintentar;
volver a ejecutar una subida puede crear un video duplicado.
#!/bin/bash
set -euo pipefail
shopt -s nullglob
VIDEO_DIR="./videos"
METADATA_DIR="./metadata"
RATE_LIMIT=1000 # Kbps
upload_video() {
local video=$1
local metadata=$2
if [ -f "$metadata" ]; then
youtubeuploader -filename "$video" \
-metaJSON "$metadata" \
-ratelimit "$RATE_LIMIT"
else
youtubeuploader -filename "$video" \
-title "$(basename "$video" .mp4)" \
-privacy "private" \
-ratelimit "$RATE_LIMIT"
fi
}
for video in "$VIDEO_DIR"/*.mp4; do
filename=$(basename "$video")
name="${filename%.*}"
metadata="$METADATA_DIR/$name.json"
echo "Processing $filename"
if upload_video "$video" "$metadata"; then
echo "Successfully uploaded $filename"
else
echo "Upload failed for $filename; check the result before retrying" >&2
exit 1
fi
done
Haz que el script sea ejecutable con:
chmod +x batch-upload.sh
Integración de subidas automatizadas
Llama a este script de Node.js desde tu productor después de que este cierre un archivo de video
terminado. Un evento de vigilancia del sistema de archivos o un retraso fijo no demuestra que un
archivo se haya escrito por completo. Guárdalo como upload.cjs y
ejecuta node upload.cjs ./uploads/video.mp4. Serializa las llamadas que comparten la misma caché de tokens de OAuth.
const { execFile } = require('node:child_process')
const { mkdtemp, rm, writeFile } = require('node:fs/promises')
const { tmpdir } = require('node:os')
const path = require('node:path')
const { promisify } = require('node:util')
const execFileAsync = promisify(execFile)
const RATE_LIMIT = 1000 // Kbps
async function processAndUpload(videoPath) {
const directory = await mkdtemp(path.join(tmpdir(), 'youtube-upload-'))
try {
const metadata = {
title: path.basename(videoPath, path.extname(videoPath)),
description: `Uploaded on ${new Date().toISOString()}`,
tags: ['auto-upload'],
privacyStatus: 'private',
madeForKids: false,
embeddable: true,
publicStatsViewable: true,
}
const metadataPath = path.join(directory, 'metadata.json')
await writeFile(metadataPath, `${JSON.stringify(metadata, null, 2)}\n`, { flag: 'wx' })
const { stdout, stderr } = await execFileAsync('youtubeuploader', [
'-filename',
path.resolve(videoPath),
'-metaJSON',
metadataPath,
'-ratelimit',
String(RATE_LIMIT),
])
if (stderr) {
console.error(`Upload stderr: ${stderr}`)
}
console.log(`Upload successful: ${stdout}`)
} finally {
await rm(directory, { recursive: true, force: true })
}
}
async function main() {
const videoPath = process.argv[2]
if (!videoPath) throw new Error('Usage: node upload.cjs <completed-video>')
await processAndUpload(videoPath)
}
main().catch((error) => {
console.error(`Upload failed: ${error.message}`)
process.exitCode = 1
})
Solución de problemas comunes
Limitación de velocidad y control de ancho de banda
Controla el ancho de banda de subida para evitar la congestión de la red:
# Limit upload speed to 1000 kbps
youtubeuploader -filename video.mp4 -ratelimit 1000
# Limit bandwidth during business hours
youtubeuploader -filename video.mp4 -ratelimit 1000 -limitBetween 9:00-17:00
Problemas de autenticación
Si tienes problemas de autenticación:
- Revisa la ruta de la caché de tokens (
request.tokende forma predeterminada, o el argumento-cache). - Confirma que
client_secrets.jsoncorresponde al proyecto y al URI de redirección previstos. - Para volver a autorizar, ejecuta el comando con una ruta
-cachenueva y completa el flujo de autenticación en el navegador. - Asegúrate de haber añadido usuarios de prueba en la pantalla de consentimiento de OAuth si tu app sigue sin verificar.
Errores de red y de API
Para fallos intermitentes:
- Comprueba si una solicitud fallida creó un video antes de iniciar una subida nueva.
- Monitorea el uso de la cuota de la API en la Google Cloud Console.
- Usa la opción
-ratelimitpara gestionar el ancho de banda. - Detente cuando se agote la cuota y reanuda después de que se restablezca o de que te la aumenten.
Conclusión
youtubeuploader ofrece una solución robusta para automatizar las subidas a YouTube desde la línea de comandos. Sus funciones de gestión de metadatos, limitación de velocidad y procesamiento por lotes lo convierten en una herramienta ideal para quienes desarrollan y buscan optimizar su flujo de trabajo de publicación de videos.
Si necesitas un procesamiento de video avanzado antes de subirlo a YouTube, considera usar el servicio de Encoding de video de Transloadit para preparar tus videos con una calidad y compatibilidad óptimas.
