Sistema de orquestração distribuída para processar playlists e canais do YouTube usando Google Sheets como camada de coordenação
Project description
YT G-Sheets Orchestrator
Sistema de orquestração distribuída para processar playlists e canais do YouTube usando Google Sheets como camada de coordenação.
Documentação: Início Rápido | Exemplos | Deployment | Contribuindo | Changelog
Visão Geral
Este projeto implementa um sistema de processamento distribuído de tarefas onde múltiplos workers se coordenam através do Google Sheets para extrair metadados de fontes do YouTube e processar vídeos individuais. Cada worker opera independentemente com sua própria service account, usando eleição de liderança e ownership baseado em claim para distribuir trabalho com segurança entre o cluster.
Arquitetura
O sistema usa um padrão de pipeline com três tabelas tanto para sources quanto para tasks:
- Fila Principal: Itens pendentes aguardando reivindicação
- History: Itens completados com sucesso
- DLQ (Dead Letter Queue): Itens falhados com mensagens de erro
Workers se registram em uma tabela Workers com IDs únicos, heartbeats e estatísticas de processamento. Eleição de liderança é usada para coordenar o processamento de sources, enquanto tasks individuais podem ser reivindicadas por qualquer worker ativo.
Requisitos
- Python 3.10+
- Google Cloud service account com acesso à API do Sheets
- yt-dlp para extração de metadados do YouTube
Instalação
Via PyPI
# Usando uv (recomendado)
uv pip install yt-gsheet-orchestrator
# Ou usando pip
pip install yt-gsheet-orchestrator
Para Desenvolvimento
# Clone o repositório
git clone https://github.com/AndreKoraleski/YT-G-Sheets-Orchestrator.git
cd YT-G-Sheets-Orchestrator
# Instale com dependências de desenvolvimento
uv pip install -e ".[dev]"
Configuração
Crie um arquivo .env na raiz do projeto com as seguintes variáveis:
WORKER_NAME=worker-1
SPREADSHEET_ID=your-spreadsheet-id
SERVICE_ACCOUNT_FILE=path/to/service-account.json
Variáveis de Ambiente
WORKER_NAME: Identificador único para esta instância de worker (obrigatório)SPREADSHEET_ID: ID da planilha do Google Sheets (obrigatório)SERVICE_ACCOUNT_FILE: Caminho para o arquivo JSON da service account do Google Cloud (obrigatório)
Uso
Executando um Worker
# Com uv
uv run python -m orc
# Ou diretamente se instalado no ambiente
python -m orc
O worker irá:
- Registrar ou recuperar sua sessão na tabela Workers
- Tentar reivindicar tasks disponíveis da fila Tasks
- Se não houver tasks, adquirir liderança para processar sources
- Extrair metadados de URLs do YouTube e criar novas tasks
- Processar tasks chamando a função callback configurada
- Realizar shutdown gracioso em SIGINT/SIGTERM
Uso Programático
from orc import Config, Orchestrator
# Inicializa com variáveis de ambiente
config = Config()
orchestrator = Orchestrator(config)
# Define callback de processamento de task
def process_video(url: str) -> None:
"""
IMPORTANTE: Propague exceções! O orchestrator capturará erros
automaticamente e moverá tasks falhadas para a DLQ com detalhes.
"""
print(f"Processando: {url}")
# Se algo der errado, levante uma exceção
if not url.startswith("https://"):
raise ValueError(f"URL inválida: {url}")
# Sua lógica de processamento aqui
# Qualquer exceção será capturada e registrada na DLQ
# Processa tasks em loop
while orchestrator.process_next_task(process_video):
orchestrator.send_heartbeat()
Adicionando Sources
Adicione URLs de playlists ou canais do YouTube diretamente na tabela Sources do Google Sheets:
| ID | URL | Nome | Quantidade de Vídeos | Timestamp de Reivindicação | Timestamp de Conclusão | Status | Worker Atribuído |
|---|---|---|---|---|---|---|---|
| https://youtube.com/playlist?list=... | PENDING |
O sistema automaticamente irá:
- Atribuir um UUID à source
- Extrair metadados usando yt-dlp
- Criar tasks individuais para cada vídeo
- Mover a source para History após conclusão
Estrutura do Google Sheets
Tabela Workers
Rastreia workers ativos e suas estatísticas de processamento.
Cabeçalhos: ID do Worker, Nome do Worker, Último Heartbeat, Status, Tarefas Processadas, Fontes Processadas
Tabelas Tasks
- Tasks: Fila principal com tasks pendentes
- Tasks History: Tasks processadas com sucesso
- Tasks DLQ: Tasks falhadas com mensagens de erro
Cabeçalhos: ID, ID da Fonte, URL, Nome, Duração, Timestamp de Criação, Timestamp de Reivindicação, Timestamp de Conclusão, Status, Worker Atribuído
Tabelas Sources
- Sources: Fila principal com sources pendentes
- Sources History: Sources processadas com sucesso
- Sources DLQ: Sources falhadas com mensagens de erro
Cabeçalhos: ID, URL, Nome, Quantidade de Vídeos, Timestamp de Reivindicação, Timestamp de Conclusão, Status, Worker Atribuído
Tabela de Eleição de Líderes
Coordena liderança distribuída para processamento de sources.
Cabeçalhos: Nome da Eleição, Worker ID, Expira Em
Funcionalidades
Coordenação Distribuída
- Registro de Workers: Cada worker mantém uma sessão única com persistência de UUID
- Eleição de Liderança: Coordenação baseada em lease para processamento de sources (TTL de 5 minutos)
- Ownership por Claim: Workers reivindicam tasks/sources usando operações atômicas
- Deduplicação: Verificação automática contra History e DLQ antes do processamento
Rate Limiting
O sistema implementa rate limiting dinâmico no nível do gateway:
- Rate limit base: 1.0 segundo entre chamadas de API
- Jitter escalável: Aumenta proporcionalmente com workers ativos
- 1 worker: sem jitter
- 2 workers: até 0.5s de jitter
- 5 workers: até 2.0s de jitter
Isso previne esgotamento de quota da API enquanto permite que múltiplos workers operem eficientemente.
Tolerância a Falhas
- Shutdown Gracioso: Handlers de SIGINT/SIGTERM marcam workers como INACTIVE e liberam liderança
- Retry Automático: Erros transientes são retentados com backoff exponencial
- Dead Letter Queue (DLQ): Sistema de captura de erros
- Qualquer exceção levantada no callback é automaticamente capturada
- Tasks/Sources falhadas são movidas para DLQ com mensagem de erro completa
- IMPORTANTE: Sempre propague exceções no seu callback - não as capture internamente
- O orchestrator garante que
str(e)seja registrado na coluna de erro da DLQ - Ideal para debugging: veja exatamente o que falhou e por quê
- Recuperação de Sessão: Workers podem retomar sua sessão anterior ao reiniciar
Extração de Metadados
Usa yt-dlp para extrair:
- IDs de vídeo diretamente das URLs do YouTube (formato de 11 caracteres)
- Nomes de playlists/canais e contagens de vídeos
- Títulos e durações de vídeos individuais
Estrutura do Projeto
src/orc/
├── __init__.py # API pública (Config, Orchestrator)
├── __version__.py # Versão do pacote
├── config.py # Gerenciamento de configuração
├── orchestrator.py # Lógica principal de orquestração
├── gateway/ # Operações do Google Sheets
│ ├── connection.py # Conexão com planilha
│ ├── worksheet.py # Gerenciamento de abas
│ ├── operations.py # Operações CRUD
│ ├── leader.py # Eleição de liderança
│ └── _retry.py # Retry e rate limiting
└── tables/ # Lógica específica de tabelas
├── worker_table.py # Gerenciamento de workers
├── task_table.py # Operações da fila de tasks
└── source_table.py # Operações da fila de sources
Licença
MIT License - Veja o arquivo LICENSE para detalhes.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file yt_gsheet_orchestrator-0.1.2.tar.gz.
File metadata
- Download URL: yt_gsheet_orchestrator-0.1.2.tar.gz
- Upload date:
- Size: 44.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ef11dc2ceacca3345a02b4bdb258c31d1635d6c115eb6863f19afd5a92d8bd89
|
|
| MD5 |
23df49c296bea5638fbc5c9b1735f1e4
|
|
| BLAKE2b-256 |
4c7dc2f2ea013de5fe0a86e426102c55e3505b6c4fde41af8e6e2f8cd0d7c321
|
File details
Details for the file yt_gsheet_orchestrator-0.1.2-py3-none-any.whl.
File metadata
- Download URL: yt_gsheet_orchestrator-0.1.2-py3-none-any.whl
- Upload date:
- Size: 36.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e0a53cf8bf1e99d6ea1e45884a17942521b5a0967bb20b6eec51bca10a8b6f1c
|
|
| MD5 |
001e6a477219bb2679e03830b5f7852d
|
|
| BLAKE2b-256 |
e95693757a2866650e58f35c915dd5fe5aa5767bb0df5c3f181add95c8e14640
|