← Cases
AutomaçãoIA aplicadaDados

Extensão de navegador que transforma vídeo do YouTube em nota de estudo

Um clique dispara um pipeline de 4 sistemas — extensão, API local, LLM e vault no Obsidian — que transcreve, reescreve e salva a aula como nota de estudo pronta.

1 clique
do vídeo à nota de estudo pronta
4
sistemas encadeados num pipeline só
0
metadado aceito sem validação do que o modelo escreve
2
bugs reais de produção documentados e corrigidos

O problema

Assistir uma aula técnica no YouTube e transformar isso em conhecimento aplicável ao meu trabalho real consome tempo em dois pontos: assistir a hora inteira, e depois traduzir o que vi pra alguma coisa que eu realmente vá usar. Eu queria fechar esse ciclo com um clique — e, já que eu ia escrever o prompt mesmo, usar isso de propósito pra reativar meu inglês em nível avançado, não só resumir em português.

A arquitetura: um pipeline de 4 estágios

Funciona como a ponta de um fluxo que atravessa extensão de navegador, API local do painel, API de um provedor de IA e o sistema de arquivos do meu vault de notas no Obsidian. Cada estágio resolve um problema técnico específico.

Extensão de navegador. Injeta um botão fixo em qualquer página de vídeo. Decisão deliberada: o botão fica solto na tela, não encaixado nos controles nativos — o DOM interno do YouTube muda com frequência (é uma SPA pesadamente ofuscada), então qualquer integração “encaixada” quebraria a cada atualização deles. E como o YouTube troca de vídeo sem recarregar a página, um listener de carregamento comum sumiria depois do primeiro vídeo — a extensão usa dois listeners redundantes, o evento de navegação próprio da plataforma e um observador de mudança no DOM como rede de segurança, caso o primeiro falhe em algum fluxo. As permissões da extensão são restritas a dois domínios: o do vídeo e o da API local — ela fisicamente não consegue chamar mais nada.

Job assíncrono no painel. O clique dispara uma chamada que devolve na hora um identificador de job e processa em paralelo — porque baixar áudio e transcrever pode levar minutos, e seguraria a conexão esperando. A extensão consulta o status a cada poucos segundos até o resultado ficar pronto. É o padrão clássico de resposta imediata mais consulta assíncrona, implementado com a ferramenta mais simples possível — sem fila externa, proporcional ao tamanho real do problema: um usuário só, uso esporádico.

Transcrição em cascata. Primeiro tenta pegar legenda existente do vídeo — instantâneo e gratuito quando existe. Só se não houver, baixa o áudio e manda pra transcrição por IA. Minimiza custo e tempo por padrão, sem esforço extra quando a via barata já resolve.

Geração da nota. O prompt separa explicitamente duas seções que fácil se misturariam: o que o vídeo ensina, fiel à didática original de quem apresenta, sem adaptar nada — e como isso se aplica ao meu trabalho real, só aí entrando o contexto específico. Separar as duas evita o resultado raso de “resumo genérico com uma frase de aplicação solta”: força o modelo a ensinar de verdade antes de aplicar de verdade.

Onde a engenharia aparece de verdade: dois bugs reais

Legenda duplicada. O formato de legenda automática do YouTube repete a linha anterior a cada trecho — é assim que o formato incremental funciona. Sem tratar isso, a transcrição saía com texto repetido múltiplas vezes. A correção guarda as linhas já vistas e descarta repetição, mantendo a ordem.

Resposta cortada no meio. Um teste real truncou a resposta do modelo antes de chegar na seção de vocabulário, porque o limite de tokens de saída estava baixo demais pro tamanho do prompt. Documentei o bug no próprio código junto da correção — não foi “ajustar o prompt e torcer”, foi entender exatamente onde o limite estourava.

A decisão mais defensável: nunca confiar no LLM pra dado factual

O frontmatter de cada nota — título, data, fonte, tags — é sempre montado por código, nunca aceito do que o modelo escreveu, mesmo pedindo explicitamente no prompt pra ele não gerar isso. Em teste real, o modelo alucinou a data. A correção foi tirar do modelo qualquer responsabilidade sobre dado que precisa ser exato, deixando com ele só o que é síntese e interpretação de texto.

É o mesmo padrão que uso nas rondas de notícia: o modelo nunca reescreve a informação factual, só julga o que é relevante. Um princípio que se repete no projeto inteiro — usar IA pra julgamento e síntese, nunca pra transporte de dado que precisa estar certo.

O resultado

Um botão, e a aula vira nota de estudo estruturada no meu vault — didática original preservada numa seção, aplicação ao meu trabalho na outra, em inglês avançado de propósito. O tempo de “assistir e depois anotar” virou o tempo de assistir a extração rodar.

Como eu trabalho nisso

Especifiquei e dirigi cada estágio via Claude Code — a arquitetura de 4 sistemas, o padrão assíncrono, a separação de seções no prompt, a decisão de nunca confiar no modelo pra dado factual — revisando e testando até encontrar os dois bugs reais acima. Não escrevi o JavaScript da extensão nem o parser de legenda à mão; sei exatamente por que cada peça existe, porque testei até ela quebrar e corrigi.