Exportar arquivos para o YouTube pela linha de comando
Automatizar seus uploads para o YouTube pode economizar bastante tempo. Neste tutorial, você vai aprender a usar o youtubeuploader, uma ferramenta CLI moderna baseada em Go, para gerenciar com eficiência seu fluxo de publicação de vídeos pela linha de comando.
Limitações importantes da API do YouTube
Antes de começar a implementação, observe estas restrições importantes impostas pela API do YouTube:
- Novos projetos de API só podem fazer upload de vídeos privados até serem verificados pelo Google.
- Confira a cota do seu projeto e os limites atuais de upload de vídeos. Aguardar entre uploads não repõe uma cota diária.
- As credenciais OAuth 2.0 devem estar configuradas corretamente.
- Apps não verificados exigem a inclusão de usuários de teste na tela de consentimento OAuth.
Instalar o youtubeuploader
Baixe e instale o binário pré-compilado do youtubeuploader para sua 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
Se você usa Windows, baixe o arquivo zip adequado na página de versões e extraia seu conteúdo.
Extraia o conteúdo do arquivo em um novo diretório e coloque o binário em um diretório do seu
PATH para executar os comandos abaixo, ou invoque-o como
./youtubeuploader. Execute youtubeuploader -version para verificar a
versão 1.24.4. Mantenha client_secrets.json e o arquivo gerado
request.token privados e fora do Git.
Configurar a autenticação OAuth
Configure as credenciais OAuth 2.0 seguindo estas etapas:
- Acesse o Google Cloud Console.
- Crie um projeto ou selecione um existente.
- Acesse APIs & Services e ative a YouTube Data API v3.
- Configure a tela de consentimento OAuth definindo o nome do aplicativo, o e-mail de suporte, os escopos necessários e adicionando usuários de teste (para apps não verificados).
- Crie credenciais OAuth selecionando o tipo “Web application” e adicionando
http://localhost:8080/oauth2callbackcomo URI de redirecionamento autorizado. - Baixe o arquivo
client_secrets.jsonresultante e coloque-o no seu diretório de trabalho.
Comandos básicos de upload
Veja exemplos práticos para fazer upload de vídeos usando o 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
Gerenciar metadados de vídeos
Crie um arquivo metadata.json para especificar informações detalhadas sobre o vídeo:
{
"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"
}
Faça upload do vídeo com os metadados executando:
youtubeuploader -filename video.mp4 -metaJSON metadata.json
Script de upload em lote
O script Bash a seguir faz upload sequencial de arquivos concluídos e para na primeira falha.
Os metadados JSON substituem os metadados da linha de comando, então defina
privacyStatus de forma intencional em cada arquivo.
Após uma falha de rede com resultado incerto, verifique se o YouTube recebeu o upload antes de tentar
novamente; repetir um upload pode criar um vídeo 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
Torne o script executável com:
chmod +x batch-upload.sh
Integração de upload automatizado
Chame este script Node.js no seu processo produtor após ele fechar um arquivo de vídeo concluído.
Um evento de monitoramento do sistema de arquivos ou um atraso fixo não comprova que a gravação do
arquivo terminou. Salve-o como upload.cjs e execute
node upload.cjs ./uploads/video.mp4. Execute em série as chamadas que compartilham o mesmo cache de tokens 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
})
Solucionar problemas comuns
Limitação de taxa e controle de largura de banda
Controle a largura de banda do upload para evitar congestionamento da rede:
# 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 autenticação
Se você encontrar problemas de autenticação:
- Verifique o caminho do cache de tokens (
request.tokenpor padrão, ou o argumento-cache). - Confirme que
client_secrets.jsonpertence ao projeto e ao URI de redirecionamento pretendidos. - Para autorizar novamente, execute com um novo caminho em
-cachee conclua o fluxo de autenticação no navegador. - Garanta que usuários de teste estejam adicionados à tela de consentimento OAuth se o app continuar não verificado.
Erros de rede e da API
Para falhas intermitentes:
- Verifique se uma solicitação que falhou criou um vídeo antes de iniciar um novo upload.
- Monitore o uso da cota da API no Google Cloud Console.
- Use a opção
-ratelimitpara gerenciar a largura de banda. - Pare quando a cota se esgotar e retome após ela ser renovada ou aumentada.
Conclusão
O youtubeuploader oferece uma solução robusta para automatizar uploads para o YouTube pela linha de comando. Seus recursos de gerenciamento de metadados, limitação de taxa e processamento em lote fazem dele uma ferramenta ideal para desenvolvedores que buscam otimizar seu fluxo de publicação de vídeos.
Para necessidades avançadas de processamento de vídeo antes do upload para o YouTube, considere usar o serviço de codificação de vídeo da Transloadit para preparar seus vídeos com qualidade e compatibilidade ideais.
