Uma plataforma de rotulagem e análise de vídeos de Jiu-Jitsu, construída para transformar horas de luta do Campeonato Mundial IBJJF em dados estruturados: quem lutou, quem venceu, como venceu e em que segundo exato. Cada evento marcado manualmente — queda, finalização, passagem de guarda, raspagem — vira uma linha no BigQuery.
O objetivo final é acumular dataset de treino suficiente para, um dia, treinar um pipeline de visão computacional que reconheça esses movimentos sozinho, direto do vídeo. A rotulagem manual de hoje é o primeiro passo dessa cadeia.
Busque vídeos de campeonatos, rotule lutas para gerar dataset de treino, ou acompanhe o progresso e os insights da fila já organizada.
Essa etapa roda fora do navegador, via um script Python que usa a YouTube Data API v3 (oficial, gratuita dentro de cota). Ele gera um CSV com termo de busca, link, título, descrição, canal e data de publicação — exatamente as colunas que a aba Rotulador espera na importação.
⚠️ Nunca compartilhe sua chave de API preenchida (em chats, repositórios públicos, etc). Se uma chave for exposta acidentalmente, revogue-a e gere uma nova em console.cloud.google.com/apis/credentials.
buscar_videos_ibjjf.py — chave substituída por placeholder
O dono deste vídeo não permite reprodução em sites externos — não dá pra assistir aqui dentro.
Abrir no YouTubeMarcar eventos por atalho de teclado fica desabilitado pra este vídeo (o player não está tocando de verdade).
| Tempo | Tipo | Subtipo / detalhe | Atleta | Observação |
|---|
Atalhos: espaço play/pause · 1–0 marcar evento no tempo atual (funciona fora de campos de texto)
Seu nome fica só nesta sessão do navegador (sem login) — usado pra marcar quem revisou cada luta.
Filtre os eventos rotulados (ex: finalizações do Mica Galvão) e abra o vídeo do YouTube já no segundo certo — sem precisar procurar manualmente.
Estudo de caso — Vibe Coding
Como o BJJ Analysis saiu de um site estático com upload manual de CSV para uma plataforma com API própria, pipeline de dados no BigQuery e mais de 500 resultados oficiais de campeonato — construído inteiramente por conversa, em português, com um agente de IA.
Uma plataforma de rotulagem e análise de vídeos de Jiu-Jitsu, construída para transformar horas de luta do Campeonato Mundial IBJJF em dados estruturados: quem lutou, quem venceu, como venceu e em que segundo exato. Cada evento marcado manualmente — queda, finalização, passagem de guarda, raspagem — vira uma linha no BigQuery.
O objetivo final é acumular dataset de treino suficiente para, um dia, treinar um pipeline de visão computacional que reconheça esses movimentos sozinho, direto do vídeo. A rotulagem manual de hoje é o primeiro passo dessa cadeia.
Nenhuma linha deste projeto foi escrita em silêncio. Cada funcionalidade — da API de leitura ao scraper de resultados do IBJJF — nasceu de um pedido em português, uma pergunta de esclarecimento quando havia mais de um caminho razoável, um plano revisado antes de qualquer código ser escrito, e verificação de verdade (não "parece que funciona", mas testes reais contra a API em produção e o BigQuery) antes de considerar algo pronto.
Esta aba é essa retrospectiva: as decisões, os erros encontrados em produção, e o porquê de cada uma — não só o "o quê".
Cada etapa do projeto, na ordem em que aconteceu de verdade — como uma progressão de faixas no Jiu-Jitsu.
O ponto de partida: um site estático — Scraping, Rotulador, Dashboard e Buscador — rodando inteiramente no navegador, sem backend. Os dados viviam em CSVs exportados manualmente e reimportados a cada sessão de trabalho.
Primeira Cloud Function pública: Dashboard e Buscador passam a buscar direto do BigQuery via fetch(), eliminando o upload manual de CSV só para visualizar dados. As views agregadas do dashboard (ranking de atletas, % de finalização) foram validadas contra o BigQuery ao vivo antes de ficarem públicas — uma delas nunca tinha rodado de verdade até esse ponto.
O Rotulador ganha um botão para enviar eventos novos direto ao servidor. O desafio real: a tabela de eventos é append-only e não tem chave de deduplicação — a solução foi marcar cada evento local com uma flag synced e nunca reenviar o que já foi persistido. No caminho, um bug genuíno de produção: o CORS estava travado em http://, mas a hospedagem força redirect para https:// — corrigido com CORS dinâmico por lista de origem.
O Rotulador deixa de depender de CSV para carregar vídeos — passa a buscar direto no acervo do BigQuery, por título, campeonato ou atleta. Ajustes de UX: o player para de dar autoplay sozinho, painéis longos viram colapsáveis, e Dashboard/Buscador ganham botão de atualizar sob demanda.
Um scraper dedicado extrai o campeão (1º lugar) de cada categoria das últimas 5 edições do Mundial IBJJF direto da fonte oficial — 587 linhas, com atleta, academia e categoria completa, numa tabela própria no BigQuery, arquitetada separada do pipeline de rotulagem. No processo, uma falha de configuração real do repositório foi encontrada e corrigida: o arquivo de exclusão do git estava salvo sem o ponto inicial e nunca tinha funcionado.
Dois pipelines, dois domínios de dado, um dataset no BigQuery:
eventos_rotulados nunca teve coluna de ID. A única forma de evitar duplicata ao reenviar foi rastrear, no navegador, o que já tinha sido sincronizado — o servidor não tem como saber sozinho.
O primeiro deploy funcionou em todo teste local e quebrou em produção por causa de um redirect HTTPS da hospedagem que ninguém tinha simulado antes.
O Rotulador expõe uma chave de escrita no próprio HTML público. Documentado explicitamente como fricção contra abuso — não como segurança de verdade, porque não é.
Cada fase foi testada com navegador real (Playwright), chamadas reais contra a API em produção (curl) e conferência direta no BigQuery antes de ser dada como concluída.