BJJ Analysis

O que é o BJJ Analysis

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.

10–17 de julho de 2026 · 10 commits · github.com/vidal-bjj-analysis/bjj-analysis

Para onde vamos?

Busque vídeos de campeonatos, rotule lutas para gerar dataset de treino, ou acompanhe o progresso e os insights da fila já organizada.

Antes de rotular

Buscar vídeos no YouTube

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.

Passo a passo

  1. Gere sua chave de API gratuita em console.cloud.google.com → ative a "YouTube Data API v3" → crie uma credencial de chave de API.
  2. Baixe o script abaixo e cole sua chave no lugar de COLE_SUA_CHAVE_AQUI.
  3. Instale a dependência: pip install requests --break-system-packages
  4. Ajuste (se quiser) os canais, termos de busca e palavras de exclusão no topo do arquivo.
  5. Rode: python3 buscar_videos_ibjjf.py
  6. O resultado sai em videos_ibjjf.csv — esse é o arquivo que você importa na aba Rotulador.

⚠️ 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.

Script

buscar_videos_ibjjf.py — chave substituída por placeholder


    
Selecione ou adicione um vídeo

O dono deste vídeo não permite reprodução em sites externos — não dá pra assistir aqui dentro.

Abrir no YouTube

Marcar eventos por atalho de teclado fica desabilitado pra este vídeo (o player não está tocando de verdade).

00:00--:--
1.00x

Eventos marcados

TempoTipoSubtipo / detalheAtletaObservação
00:00

Atalhos: espaço play/pause · 10 marcar evento no tempo atual (funciona fora de campos de texto)

Sincronização com o servidor
0 vídeos · 0 eventos na fila

Revisor

Seu nome fica só nesta sessão do navegador (sem login) — usado pra marcar quem revisou cada luta.

Carregando lutas detectadas...
Carregar CSV manualmente (caso o servidor esteja indisponível)
Aguardando dados do servidor... se não carregar, use o upload manual de CSV acima.
Buscador

Encontre o momento exato

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.

Carregar CSV manualmente (caso o servidor esteja indisponível)
Aguardando dados do servidor... se não carregar, use o upload manual de CSV acima.

Estudo de caso — Vibe Coding

De faixa branca a faixa preta

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.

16–17 de julho de 2026 · 10 commits · github.com/vidal-bjj-analysis/bjj-analysis

Capítulo 1

O que é o BJJ Analysis

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.

Capítulo 2

O que significa "vibe coding" aqui

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ê".

Capítulo 3

A jornada em 5 faixas

Cada etapa do projeto, na ordem em que aconteceu de verdade — como uma progressão de faixas no Jiu-Jitsu.

Fundação Faixa Branca

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.

A API de leitura Faixa Azul

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.

A API de escrita Faixa Roxa

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.

Busca inteligente e polimento Faixa Marrom

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 novo domínio de dado Faixa Preta

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.

Capítulo 4

Arquitetura

Dois pipelines, dois domínios de dado, um dataset no BigQuery:

Scraper YouTubePython
Rotuladorsite/index.html
APICloud Function
BigQuerybjj_analytics
Dashboard / Buscadorfetch()
ibjjfdb.comresultados oficiais
Scraper resultadosPython + BeautifulSoup
CSV
BigQueryresultados_campeonatos
Capítulo 5

Decisões que valeram a pena contar

Tabela sem chave, dedupe no cliente

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.

Um bug de CORS ensinou mais que a implementação

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.

Chave de API sem fingir ser segredo

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 é.

Nada foi "pronto" sem rodar de verdade

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.

Capítulo 6

Stack técnica

Google Cloud
Cloud Functions (gen2) BigQuery Cloud Storage Secret Manager IAM
Frontend
HTML / CSS / JS vanilla Chart.js PapaParse
Backend & coleta de dados
Python BeautifulSoup Requests YouTube Data API v3
Testes & verificação
Playwright curl bq CLI
Capítulo 7

Próximos passos

  • Conectar o Looker Studio às views já validadas no BigQuery.
  • Automatizar o deploy do site (hoje é upload manual via FTP para a Hostinger).
  • Expor resultados_campeonatos como endpoint público na API.
  • Cruzar nomes de atletas rotulados com os campeões oficiais do IBJJF.
  • O objetivo original do projeto: treinar um pipeline de visão computacional sobre os dados rotulados até aqui.