Yabancılarla anonim olarak birlikte YouTube izleme — biri ayrılınca odanın yok olduğu 1:1 eşzamanlı izleme
(momentbrand.site)Bunu, algoritma önerileriyle değil de "birinin bizzat seçip açtığı bir videoyla" karşılaşma fikriyle yaptım. Eski yelkenli tekne konsepti.
Anonim bir kullanıcı bir YouTube bağlantısını ve tek satırlık bir mektubu "yelkenli tekne" olarak gönderince, başka bir anonim kullanıcı buna tıklıyor ve 1:1 izleme odası açılıyor. İki kişinin YouTube oynatıcısı aynı sahneye senkronize ediliyor ve anonim sohbet ederken birlikte izliyorlar. İkisinden biri ayrıldığı anda oda ve sohbetin tamamı yok oluyor.
Başta konsept, video bittiğinde 3 dakikalık bir geri sayımdan sonra odanın patlamasıydı; ama kullanınca gördüm ki iyi anlaştığınız biriyle karşılaşınca "bir tane daha" demek çok doğal oluyor — bu yüzden video bitse bile oda açık kalıyor ve oda sahibi videoyu değiştirip izlemeye devam edebiliyor.
Yaparken eğlenceli olan / çok uğraştıran kısımlar:
- Senkronizasyon: sunucu referans zamanı belirliyor (RTT düzeltmesi), 0,5 saniye içindeki drift yok sayılıyor, 2 saniyenin altındaki farklarda oynatma hızı 0.95~1.05x ile kullanıcı fark etmeden kapatılıyor, bunun üzerindekilerde ise
seekToile zorunlu düzeltme yapılıyor. Reklam oynarken düzeltme duruyor. - Asıl uğraştıran şey canlı yayınlardı. Canlı yayında
seekToyalnızca DVR penceresi içinde çalışıyor ama iki izleyicinin DVR penceresi birbirinden farklı olabiliyor; bu yüzden "oda sahibi canlı yayın ucunda" niyetini karşı tarafın pencere ölçüsüne göre çevirmek gerekiyordu.loading→play→loadingsonsuz yankı döngüsüne kadar gittik — commit loguna bakınca sadece canlı senkronizasyon düzeltmeleri için bile 7 commit var. - Eşleşme race durumu: aynı yelkenli tekneye aynı anda birden fazla kişinin binmesini Redis Lua script atomik kilidiyle engelledim (
5kişinin aynı anda katılma testinde yalnızca1kişinin kazandığını doğruladım). - Gömme engelli videolarda (hata 153) IFrame API
onErrorfırlatmadığı için ekran sadece siyah kalıyordu; bunu 8 saniyelik oynatma watchdog ile tespit edip "oynatılamıyor" uyarısını gösterecek şekilde çözdüm. - Anonim 1:1 olduğu için çok sayıda güvenlik önlemi ekledim: tüm sohbet sunucu tarafında sanitize ediliyor, harici iletişim bilgileri otomatik maskeleniyor, yapay zeka moderasyonu + biriken şikayetlere göre engelleme var, kriz anahtar kelimeleri algılanınca danışma hattı yönlendirmesi gösteriliyor.
Stack: Next.js 15 / Fastify 5 / Socket.io / Redis 7 / Postgres 16, mobilde Expo(RN)
Kayıt olmadan hemen deneyebilirsiniz. Bu hafta iOS uygulaması da App Store'a çıktı: https://apps.apple.com/kr/app/float/id6777661839
Geri bildirimlere açığım.
Henüz yorum yok.