O Que É Isso?
Criei o Video Chain Player, um app web que permite "encadear apenas os segmentos necessários de vídeos e reproduzi-los/compartilhá-los como uma única experiência."
🔗 Experimente agora: https://video-chain-player.sloth255.com/
- Recorte um vídeo especificando horários de início e fim
- Encadeie (fila) múltiplos clipes para reprodução contínua
- Codifique o estado da cadeia em uma URL e compartilhe com um único link
Perfeito para criar experiências de "mostre apenas esta parte", como fluxos de treino, destaques de aulas ou compilações.
O Que os Usuários Podem Fazer
- Criar clipes: Adicionar vídeos inserindo URL/ID e horários de início/fim
- Reordenar: Ajustar a sequência com arrastar e soltar
- Pré-visualizar: Reproduzir no momento para verificar o timing
- Compartilhar: Copiar a URL e enviar (destinatários abrem a mesma cadeia)
- Multilíngue: Trocar idiomas via URL (ex.:
?lang=ja)
Stack Tecnológica
| Área | Tecnologia | Observações |
|---|---|---|
| Frontend | React 18 + TypeScript | Manutenibilidade da UI e segurança de tipos |
| Build/Servidor Dev | Vite | HMR rápido, ótima DX |
| Roteamento | React Router v6 | Estado expresso via path + query |
| Gerenciamento de Estado | Zustand | Leve, adequado para sincronização com URL |
| UI de Arrastar e Soltar | @dnd-kit | Implementar reordenação |
| Player de Vídeo | react-youtube (IFrame Player API) | Reprodução incorporada rápida |
| i18n | i18next + react-i18next | Trad. de todas as strings da UI |
| Carregamento de Tradução | i18next-http-backend | Fetch em tempo de execução de /public/locales/... |
| Detecção de Idioma | i18next-browser-languagedetector | Prioridade: ?lang= / localStorage / navegador |
| Analytics | GA4 (gtag) | SPA page_view + eventos customizados |
| Hospedagem | S3 Static Site + CloudFront | Entrega via CDN |
| IaC | Template AWS SAM | Gerenciar S3/CloudFront como código |
| CI/CD | GitHub Actions + OIDC | Deploy sem chaves de longa duração |
| Testes | Vitest + Testing Library | Testar componentes/lógica |
| Lint/Formato | ESLint + Prettier | Prevenir regressões |
Arquitetura e Destaques de Implementação
1) Sincronizar Estado do Zustand com URL para Compartilhamento Instantâneo
Para minimizar o atrito no compartilhamento, projetei o app para codificar as informações essenciais da cadeia na URL.
- Sem armazenamento no servidor (sem necessidade de conta)
- Destinatários podem reproduzir o mesmo estado simplesmente abrindo o link
Para evitar o inchaço da URL (o que dificulta o compartilhamento), minimizei as informações codificadas na URL.
- Codificar apenas
iddo vídeo e horáriosstart/end - Complementar títulos e miniaturas depois para exibição (evita inchaço da URL)
Exemplo de codificação mínima:
// Codificar apenas informações essenciais (id/start/end) na URL
const minimalSegments = segments.map(({ id, start, end }) => ({ id, start, end }));
Além disso, links compartilhados não incluem a posição de reprodução (qual clipe está tocando), garantindo que "abrir o link começa do início."
2) Carregamento de i18n em Tempo de Execução via HTTP Backend (Independente de Build)
Inicialmente, considerei importar os JSONs de tradução em tempo de build, mas para melhor compatibilidade com hospedagem estática e CI, optei por buscar via HTTP de /public/locales/{{lng}}/translation.json.
- Fácil de manter — basta adicionar arquivos de idioma
- O processo de build não depende de importações de tradução
3) Tratar Variações de URL de Forma Robusta (watch / Shorts / embed)
Suportar "apenas URLs padrão" seria inconveniente, então expandi os padrões de entrada:
- URLs watch padrão
- Shorts
- URLs embed
Como resultado, a taxa de sucesso de "colar e pronto" aumentou, tornando o cadastro em lote muito mais fácil.
4) Deploy: S3 + CloudFront, CI: GitHub Actions (OIDC)
Por ser um site estático, o deploy é simples:
- S3 (hospedagem estática)
- CloudFront (CDN)
O CI/CD é automatizado via GitHub Actions: build → sync com S3 → invalidação de cache do CloudFront.
O ponto-chave é o OIDC, permitindo deploy sem armazenar chaves de longa duração (minimizando Secrets enquanto mantém controle por ambiente).
Mesmo para sites estáticos, colocar o CloudFront na frente oferece:
- Carregamento rápido via cache
- Fácil assistência ao roteamento SPA (ex.: fallback para
/)
Resumo
O Video Chain Player foca em "clipes × reprodução contínua × compartilhamento por URL", com ênfase em:
- Codificar estado em URLs para minimizar o atrito no compartilhamento
- i18n + sincronização de idioma por URL para que destinatários vejam o mesmo idioma
- Torná-lo "pronto para produção" incluindo deploy e analytics
Tecnicamente, consegui combinar:
- Desenvolvimento rápido com Vite
- Sincronização do estado do Zustand com URLs para melhor compartilhamento
- Gerenciamento leve de traduções com o backend HTTP do i18next
- Deploy seguro com OIDC
Construir todo esse "stack operacional completo" de uma vez foi o ponto alto.
