1 pontos por previewapp 7 시간 전 | Ainda não há comentários. | Compartilhar no WhatsApp

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, seekTo só 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 eco loading→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.

Ainda não há comentários.