Player 16 Saat Stabilite Raporu

Kafe & işletme senaryosu — sabah 8'den gece 12'ye kesintisiz çalma

6 sistem iyi durumda ✅ 3 sorun düzeltilmeli ⚠️ 19 Şubat 2026
16 saat
hedef çalma süresi

📝 Basit Anlatım

Teknik bilgi gerekmez

Bir kafede müzik sistemi sabah 8'de açılıyor, gece 12'ye kadar çalıyor. Hiç kimse bilgisayarın başında oturmuyor — müzik kendi kendine devam etmeli.

Kodu inceledik. İyi haber: Temel yapı sağlam — bellek temizliği var, hata sonrası otomatik devam var, şarkı geçişleri düzgün çalışıyor.

Düzeltilmesi gereken 3 şey var: İnternet kesilince müziğin duraklaması, saatler sonra bilgisayarın yavaşlaması ve oturumun kapanma ihtimali. Bunları düzeltirsek 16+ saat sorunsuz çalır.

📶
İnternet Kesilirse
Wi-Fi 5 dk kapanırsa müzik durur, kimse farkında olmaz. Otomatik devam yok.
🐌
Saatler Sonra Yavaşlama
Her şarkıda küçük bir parça arka planda birikip temizlenmiyor. 500. şarkıda hissedilir.
🔐
Oturum Kapanması
16 saatte giriş süresi dolabilir. Sistem bunu önceden anlayıp kendini yenilemeli.

🏥 Sistem Sağlık Tablosu

Bileşen Durum Not
Blob URL temizliği ✅ İyi Merkezi takip, 5 noktada revoke
HLS instance havuzu ✅ İyi Max 2 havuz + 4 aktif, overflow koruması var
Şarkı geçiş temizliği ✅ İyi Agresif temizlik, MediaSource reset
URL cache limiti ✅ İyi 30 kayıt limiti + 5 dk TTL + LRU
Hata sonrası retry ✅ İyi Çok katmanlı: fragment retry → yeni URL → MP3 fallback
Sonsuz döngü koruması ✅ İyi Başarısız şarkı 5 dk boyunca atlanıyor
Buffer Monitor listener'ları ⚠️ Risk Her şarkıda 4 listener ekleniyor, hiç silinmiyor
İnternet kesilmesi recovery ❌ Eksik online/offline event dinlenmiyor
Session yenileme ⚠️ Risk Sadece hata gelince anlıyor, proaktif yenileme yok
SORUN 1

📶 İnternet kesilince müzik tamamen duruyor

Kafe Wi-Fi'si 5 dakika kesintiye uğrarsa queue boşalır, kimse farkında olmaz

Yüksek Öncelik
Şu an ne oluyor?
  1. İnternet kesildi
  2. Mevcut şarkı buffer'dan çalmaya devam ediyor (~20 sn)
  3. Şarkı bitti, sıradaki yüklenemiyor
  4. Queue doldurulamıyor (API erişilemiyor)
  5. 🔇 Müzik durdu. Kimse bilmiyor.
Ne olmalı?
  1. İnternet kesildi
  2. Mevcut şarkı buffer'dan çalmaya devam ediyor
  3. İnternet geldi → queue otomatik dolduruluyor
  4. ✅ Müzik kesintisiz devam ediyor

🔧 Teknik Düzeltme

player-core.js içinde enableBackgroundPlayback() veya init() fonksiyonuna eklenecek.

// player-core.js — init() veya enableBackgroundPlayback() içine ekle

// İnternet kesilince
window.addEventListener('offline', () => {
    console.warn('📶 Bağlantı kesildi — queue korunuyor');
    this._networkOffline = true;
    // Queue refill'i durdur (boşuna API çağrısı yapmasın)
});

// İnternet gelince
window.addEventListener('online', () => {
    console.log('✅ Bağlantı geldi — queue yenileniyor');
    this._networkOffline = false;
    // Hemen queue doldur
    setTimeout(() => this.checkAndRefillQueue(), 1000);
});

// Queue refill fonksiyonuna guard ekle (mevcut kod ~satır 7540)
async checkAndRefillQueue() {
    if (this._networkOffline) return; // ← Bu satırı ekle
    // ... mevcut kod
}

💡 Not: navigator.onLine her zaman %100 güvenilir değil (Wi-Fi bağlı ama internet yok durumu olabilir). Bu yüzden API hatası alınca da _networkOffline = true yapılabilir.

SORUN 2

🐌 Saatler sonra tarayıcı yavaşlıyor

Buffer Monitor her şarkıda 4 event listener ekliyor ama hiç silmiyor — 16 saatte 2300+ listener birikir

Orta Öncelik
16 saatte birikim hesabı
576
şarkı (16 saat / ~100 sn)
×4
listener/şarkı
2304
toplam listener
CPU↑
her event'te hepsi tetiklenir

🔧 Teknik Düzeltme

buffer-monitor.js dosyasında listener'lar anonim fonksiyon yerine isimli fonksiyon olacak, şarkı bitince removeEventListener çağrılacak.

// buffer-monitor.js — mevcut kod (SORUNLU)
function monitor(mediaElement) {
    mediaElement.addEventListener('waiting', function() { ... });   // ❌ anonim
    mediaElement.addEventListener('playing', function() { ... });   // ❌ anonim
    mediaElement.addEventListener('stalled', function() { ... });   // ❌ anonim
    mediaElement.addEventListener('error',   function() { ... });   // ❌ anonim
    // removeEventListener YOK!
}

// DÜZELTME: İsimli fonksiyon + cleanup
function monitor(mediaElement) {
    function onWaiting()  { ... }
    function onPlaying()  { ... }
    function onStalled()  { ... }
    function onError(e)  { ... }

    mediaElement.addEventListener('waiting', onWaiting);
    mediaElement.addEventListener('playing', onPlaying);
    mediaElement.addEventListener('stalled', onStalled);
    mediaElement.addEventListener('error',   onError);

    // Temizleme fonksiyonu döndür
    return function unmonitor() {
        mediaElement.removeEventListener('waiting', onWaiting);
        mediaElement.removeEventListener('playing', onPlaying);
        mediaElement.removeEventListener('stalled', onStalled);
        mediaElement.removeEventListener('error',   onError);
    };
}

// player-core.js — şarkı geçişinde çağır
const unmonitor = monitor(audioElement);
// ... şarkı bitti ...
unmonitor(); // ← temizle
SORUN 3

🔐 Oturum süresi dolabilir

16 saatte login süresi dolabilir. Şu an sadece API 402 dönünce anlıyor — proaktif yenileme yok

Düşük Öncelik
Reaktif (şu an)
API hata döndürür → 402 yakalanır → işletme sahibi tekrar giriş yapar
Müzik durduktan sonra fark edilir
Proaktif (olmalı)
Her 30 dakikada bir session yenilenir → hiç kesilmez
Sorun oluşmadan önlenir

🔧 Teknik Düzeltme

player-core.js init() fonksiyonuna eklenecek. Backend'de session TTL'i kontrol et — her refresh isteği session'ı uzatmalı.

// player-core.js — init() içine ekle

// Her 30 dakikada session'ı taze tut
this._sessionRefreshInterval = setInterval(async () => {
    try {
        const res = await fetch('/api/session/ping', {
            method: 'POST',
            credentials: 'same-origin',
            headers: { 'X-Requested-With': 'XMLHttpRequest' }
        });
        if (res.status === 401) {
            // Session gerçekten dolmuş → login sayfasına yönlendir
            window.location.reload();
        }
    } catch(e) { /* offline olabilir, ignore */ }
}, 30 * 60 * 1000); // 30 dakika

💡 Backend notu: /api/session/ping endpoint'i oluşturulmalı. Sadece 200 veya 401 döndürmesi yeterli. İsteği işlemek session cookie'sini otomatik uzatır.

📋 Uygulama Planı

İnternet kesilmesi recovery Yüksek
player-core.jswindow.addEventListener('online'/'offline') ekle, checkAndRefillQueue() başına guard koy
Risk: Düşük — sadece yeni event listener
Buffer Monitor listener temizliği Orta
buffer-monitor.js — anonim fonksiyonları isimli yap, unmonitor() fonksiyonu ekle, şarkı geçişinde çağır
Risk: Orta — buffer-monitor bağımlılıklarını kontrol et
Session refresh Düşük
Backend: /api/session/ping endpoint. Frontend: 30 dk setInterval
Risk: Düşük — yeni endpoint, mevcut koda dokunmuyor

🔧 Teknik Referans

Değişecek Dosyalar
  • player-core.js online/offline event, queue guard, session refresh
  • buffer-monitor.js listener cleanup sistemi
  • SongStreamController.php session/ping endpoint (opsiyonel)
İlgili Satırlar
  • player-core.js:7540 — checkAndRefillQueue() (guard eklenecek)
  • player-core.js:7451 — queueMonitorInterval (online check)
  • buffer-monitor.js:38-75 — 4 adet anonim listener
  • buffer-monitor.js:22 — monitoredElements WeakSet
19 Şubat 2026 • Muzibu.com.tr