Assistir YouTube junto com um estranho de forma anônima — sessão 1:1 sincronizada que desaparece quando uma pessoa sai
(momentbrand.site)Criei com o conceito de encontrar não uma recomendação do algoritmo, mas "um vídeo que alguém escolheu pessoalmente e colocou para tocar". O antigo conceito do barco à vela.
Quando um usuário anônimo envia um link do YouTube + uma carta de uma linha como um "barco à vela", outro usuário anônimo pode clicar nisso para abrir uma sala de exibição 1:1. Os players do YouTube das duas pessoas ficam sincronizados na mesma cena, e elas assistem juntas enquanto conversam por chat anônimo. No momento em que uma das duas sai, a sala e todo o chat desaparecem.
No começo, a ideia era que, quando o vídeo terminasse, a sala explodisse após uma contagem regressiva de 3 minutos. Mas, na prática, quando você encontra alguém com quem combina bem, "mais um vídeo" acontece naturalmente — então mudei para um formato em que a sala continua existindo mesmo depois do fim do vídeo, e o anfitrião troca o vídeo para continuar assistindo.
Partes divertidas/difíceis durante o desenvolvimento:
- Sincronização: o servidor define o horário de referência (com correção de RTT); desvios de até 0,5 segundo são ignorados; até 2 segundos, a velocidade de reprodução é ajustada entre 0,95~1,05x para recuperar sem o usuário perceber; acima disso, a correção é forçada com
seekTo. Durante anúncios, a correção é interrompida. - O verdadeiro perrengue foram as lives. Em transmissões ao vivo,
seekTosó funciona dentro da janela de DVR, mas as janelas de DVR dos dois espectadores eram diferentes, então foi preciso traduzir a intenção de "o anfitrião está na borda ao vivo" com base na janela do outro espectador. Teve até loop infinito de ecoloading→play→loading— olhando o log de commits, só correções de sincronização de live foram 7. - Race no matching: impedi que várias pessoas entrassem ao mesmo tempo no mesmo barco à vela usando lock atômico com script Lua no Redis (em teste com 5 pessoas dando join simultaneamente, confirmei que só 1 venceu).
- Em vídeos com bloqueio de embed (erro 153), a IFrame API não dispara
onError, então a tela só fica preta; detectei isso com um watchdog de reprodução de 8 segundos para exibir o aviso "não é possível reproduzir". - Como é um 1:1 anônimo, coloquei muitas proteções: sanitize de todo o chat no servidor, mascaramento automático de contatos externos, moderação por IA + bloqueio por acúmulo de denúncias, e, ao detectar palavras-chave de crise, exibição de orientação para ligar para atendimento especializado.
Stack: Next.js 15 / Fastify 5 / Socket.io / Redis 7 / Postgres 16; no mobile, Expo(RN)
Dá para testar imediatamente sem cadastro. Esta semana o app para iOS também entrou na App Store: https://apps.apple.com/kr/app/float/id6777661839
Feedbacks são bem-vindos.
Ainda não há comentários.