v2 Değişiklik Özeti (v1'den farklar)
Düzeltilen Tespitler
- isPremium() kazanç tahmini: 30-50ms → 5-15ms (model-level check zaten var)
- getSubscriptionData() çift sorgu eklendi (v1'de gözden kaçmıştı)
- HLS playlist cache kazancı: "100-300ms → 10-20ms" → %30-40 kazanç (regex kalıyor)
- trackStart: tam queue → kısmi queue (play_id senkron kalmalı)
- Cache key tutarsızlığı düzeltildi (rapor vs mevcut kod)
Kesinleşen Kararlar
- Debug: ?debug + yetkili kullanıcı (herkes değil)
- Crossfade: Normal = 5 sn, Soft Mode = 3 sn
- HLS başlangıç: Soft = 32kbps, Normal = 128kbps (mid)
- Kurumsal eşik: Admin panelden ayarlanabilir (settings)
- Soft Mode: Hibrit (otomatik algılama + kullanıcı değiştirir)
- Rate limiting acil yapılmalı (trackStart/trackHit sınırsız)
Kritik Bug: Şarkı Geçiş Sorunu
MÜŞTERİ ŞİKAYETİSorun Tanımı
Müşteri bildirimi: "Şarkı bittiğinde sonrakine geçmiyor"
Ek sorunlar: Şarkı yarıda kesilip diğerine geçiyor. Sonsuz döngü (continuous play) durduruluyor.
Kod Analizi — Geçiş Zinciri
Şarkı bittiğinde tetiklenen zincir (player-core.js):
audio.onended veya timeupdate fallback (Safari)
Satır 2758 (HLS onended) — Satır 5754-5796 (Safari fallback: son 0.5 sn'de tetiklenir)
onTrackEnded() çağrılır
Satır 2964-3040 — Debounce: 1 sn içinde tekrar çağrılmayı engeller
nextTrack(true) çağrılır — gapless geçiş
Satır 2011-2248 — Concurrent guard: _nextTrackInProgress + 300ms debounce
Queue'da sonraki şarkı VAR → playSongFromQueue()
Normal akış — sorun burada değil
Queue BİTTİ → Genre-based auto-refill
Satır 2088-2247 — API çağrısı: /api/muzibu/genres/{id}/songs — Max 5 deneme, 20 offset
Potansiyel Sebepler (7 Adet)
Queue'daki son şarkı çalındığında genre-based refill API'si çağrılır. API 404/500 dönerse veya genre_id null ise → geçiş durur. Duplikat filtre tüm şarkıları elerse → boş yanıt.
Crossfade sırasında sonraki şarkının stream URL'i alınamıyor (auth token expired, session timeout). Error recovery var ama → playSongFromQueue() da aynı auth sorunuyla başarısız olur → sonsuz hata döngüsü yerine sessizce durur.
Crossfade sırasında yeni HLS player'ın buffer'ı append edemezse → fatal error → player durur. Özellikle eski cihazlarda MediaSource API sınırlaması.
nextTrack() başında _nextTrackInProgress=true yapılır. Exception yaşanırsa finally bloğunda reset edilmeli — eğer reset edilmezse sonraki tüm geçişler engellenir.
Safari fallback mevcut (timeupdate ile son 0.5 sn'de tetiklenir) — ama Safari arka plan tabında timer throttle ederse 0.5 sn penceresi kaçabilir.
4 sn crossfade timeout'u tamamlanmadan şarkı biterse (çok kısa şarkı) veya completeCrossfade() hatası.
Preload ve crossfade aynı anda tetiklenirse, preload cleanup yeni player'ı da bozabilir. _cleanupPreloadedNext() zamanlama sorunu.
Düzeltme Planı
Queue bittiğinde: genre refill başarısızsa → popular songs'tan doldur. O da başarısızsa → shuffle ile mevcut queue'yu tekrar çal (repeat all). Hiçbir durumda player DURMAMALI.
10 sn sonra otomatik reset: setTimeout(() => this._nextTrackInProgress = false, 10000). Exception durumunda kilitlenmeyi önler.
Crossfade sırasında 401 gelirse: token yenile → tekrar dene (1 kez). Başarısızsa: playSongFromQueue() ile sonraki şarkıyı dene. Tüm queue başarısızsa: kullanıcıya bildirim göster ("Oturum süresi doldu, sayfa yenileniyor").
Her onTrackEnded, nextTrack, crossfade adımını serverLog'a yaz. Hangi adımda takıldığını görmek için. Debug panel transition logs'a entegre et.
Karar: Soft Mode Nasıl Aktifleşecek?
KESİNLEŞTİKesin Karar: Hibrit Strateji
Otomatik algılama duruma göre değişken tetikleyici — kullanıcı isterse değiştirir.
Otomatik Açılma
RAM ≤ 2GB veya bağlantı 2G
Öneri Göster
RAM < 4GB veya CPU < 4 çekirdek
Normal Mod
RAM ≥ 4GB ve CPU ≥ 4 ve 3G+
Manuel Kontrol (Her Zaman Erişilebilir)
Karar: Debug Mode Yönetimi
v2 GÜNCELLENDİMevcut Durum
performance-debug.js (180 KB, 3.505 satır) TÜM kullanıcılara HEAD'de yükleniyor. Debug paneli sadece root kullanıcı veya admin panelden "debugger aktif" işaretlenen kullanıcılara görünüyor — ama dosya herkes tarafından indiriliyor.
Yeni Davranış
Debug KAPALI → performance-debug.js HİÇ YÜKLENMESİN
Blade'de @if koşuluna al. Debug kapalıysa 180 KB'lık dosya sunucudan bile istenmez. Tüm kullanıcılar 180 KB + 3-4 MB RAM tasarrufu.
Debug = ?debug parametresi + Yetkili kullanıcı
v1'den fark: Root kullanıcı için otomatik yükleme YOK.
Debug panelini görmek için URL'ye ?debug eklenmeli VE kullanıcının debug yetkisi olmalı.
İki koşul birlikte sağlanmalı — sadece ?debug yazan yetkisiz kullanıcı göremez.
Admin panelden debug yetkisi açma + süre belirleme
Kullanıcı yönetimi → Debug aç/kapat butonu + süre belirle (1 saat, 1 gün, 1 hafta). Root kullanıcılar için de admin panelden yetki verilmeli — URL'ye ?debug yazması yeterli olsun.
Mobil dahil aktif edilebilir
?debug parametresi mobil URL'de de çalışır. Panel responsive, touch-friendly butonlar.
Karar: HLS / MP3 / Otomatik Seçimi
"Otomatik" Ne Demek?
Kullanıcı veya kurum "otomatik" seçtiğinde sistem şöyle karar verir:
"Otomatik" modunda karar ağacı: 1. Soft Mode AKTİF mi? ├─ Evet → MP3 kullan (Soft Mode = hafiflik = MP3) └─ Hayır → devam et 2. Şarkının HLS dönüştürmesi var mı? ├─ Evet → HLS kullan (kaliteli, adaptive) └─ Hayır → MP3 kullan (dönüştürme henüz yapılmamış) 3. Cihaz HLS destekliyor mu? (Hls.isSupported()) ├─ Evet → HLS └─ Hayır → MP3 (eski tarayıcı fallback)
Kurumsal Hesap Senaryosu
v2 GÜNCELLENDİKurumsal hesaplarda üye sayısı eşiği ile otomatik MP3 geçişi:
Üye Sayısı Eşiği (v2'de eklendi)
Kurumsal hesaptaki üye sayısı eşik değeri üstündeyse → otomatik MP3'e yönlendir.
// Karar mantığı:
if (corporate.members_count >= setting('corporate_mp3_threshold', 5)) {
// 5+ üyeli kurum → otomatik MP3
format = 'mp3';
} else {
// Az üyeli kurum → ENV/Sistem kararı
format = env('MUZIBU_DEFAULT_AUDIO_FORMAT', 'auto');
}
// NOT: Bireysel kullanıcı isterse kurumsal kararı EZER
Kafe / Restoran (genelde 5+ üye)
Eski tablet/telefon, WiFi paylaşımlı, gün boyu çalıyor. HLS'in şifreleme overhead'i gereksiz → MP3 yeterli ve stabil.
Spor Salonu (genelde 5+ üye)
Ses sistemi Bluetooth bağlantılı, kesintisiz çalmalı. MP3 + crossfade = en güvenilir geçiş.
Kurum sahibi kurumsal panelden "Çalma Formatı: MP3" seçer → tüm şubeler ve üyeler MP3 çalar. Ancak bireysel üye kendi profilinden "HLS" seçerse, kurumsal kararı ezer.
HLS Adaptive & Crossfade
v2 GÜNCELLENDİHLS Adaptive Bitrate — Mevcut Sistem & Plan
HLSService.php'de tanımlı variant'lar ve başlangıç seviyesi kararı:
Mevcut HLS Variant'ları (HLSService.php satır 36-40)
| Seviye | Bitrate | Sample Rate | Kanal | Bandwidth |
|---|---|---|---|---|
| ultralow | 32 kbps | 22,050 Hz | Mono | 32,000 |
| low | 64 kbps | 22,050 Hz | Mono | 64,000 |
| mid | 128 kbps | 44,100 Hz | Stereo | 128,000 |
| high | Orijinal | 48,000 Hz | Stereo | Hesaplanır |
MP3 fallback default: 256 kbps (getID3 ile orijinal bitrate algılanır, bulunamazsa 256 kbps)
Başlangıç Seviyesi Kararı (v2'de kesinleşti)
Soft Mode
autoLevelCapping = 0 SABİT. ABR serbest bırakılmaz, en düşük kalitede kalır. Gerekirse kullanıcı manuel yükseltebilir.
Normal Mod
autoLevelCapping = mid seviyede başlar. FRAG_BUFFERED sonrası ABR serbest → iyi internet varsa anında high'a çıkar.
Sonuç: HLS adaptive zaten çalışıyor. Soft Mode = 32kbps sabit, Normal = 128kbps başlangıç + ABR serbest.
Crossfade — Mevcut Durum & Plan
v2 GÜNCELLENDİŞu An
- crossfadeEnabled: false
- crossfadeDuration: 0
- Kod %100 hazır (startCrossfade, completeCrossfade, fade fonksiyonları)
- HLS 2 audio element toggle var
- Howler.js native fade() desteği var
Hedef (v2 güncellendi)
- crossfadeEnabled: true
- Normal mod: 5000ms (5 sn)
- Soft Mode: 3000ms (3 sn) (RAM tasarrufu)
- Kullanıcı tercihi (toggle) her modda erişilebilir
- Backend'den soft_config.crossfade_duration gönder
Önemli: Crossfade eski cihazlarda donmayı AZALTIR — çünkü yeni şarkı hazırlanırken eski şarkı hâlâ çalıyor. Kullanıcı sessizlik/donma hissetmez. Soft Mode'da 3 sn (daha az overlap = daha az RAM), normal modda 5 sn (daha yumuşak geçiş).
Kod İnceleme Düzeltmeleri
v2'DE YENİv1'de mevcut kod ile rapor arasındaki uyumsuzluklar tespit edildi. Aşağıda düzeltilmiş versiyonlar:
1. isPremium() — Gerçek Durum
v1'de Söylenen (Yanlış)
- "Her seferinde DB sorgusu"
- "30-50ms kazanç"
- Cache key: user:{id}:is_premium
v2'de Düzeltilmiş (Doğru)
- Model-level check var → DB'ye her seferinde gitmez
- Kazanç: 5-15ms (stale model durumlarıyla sınırlı)
- Mevcut cache key: user_{id}_is_premium_tenant_{tenant_id}
2. getSubscriptionData() — v1'de Gözden Kaçan Çift Sorgu
SongStreamController.php'de her stream isteğinde 2 ayrı DB sorgusu aynı veriyi çekiyor:
| Satır | Metod | Sorgu |
|---|---|---|
| 82 | isPremium() | DB::table('users')→value('subscription_expires_at') |
| 141/145 | getSubscriptionData() | DB::table('users')→value('subscription_expires_at') ← AYNI SORGU! |
Çözüm: isPremium() cache'lendiğinde getSubscriptionData() da aynı cache'i kullanmalı. Tek sorguda hem is_premium hem subscription_ends_at döndürülmeli — yoksa yarı kazanç kalır.
3. trackStart — Kısmi Queue (v1'de tam queue önerilmişti)
v1 Önerisi (Riskli)
Tam queue: trackStart tamamını Job'a at → anında 200 dön
Sorun: play_id henüz oluşmamış → frontend trackHit/trackEnd yapamaz!
v2 Önerisi (Güvenli)
Kısmi queue: Play kaydını SENKRON oluştur (sadece INSERT — hızlı), duplikat kontrolü ve diğer işleri queue'ya at
play_id anında döner, ağır işler arka planda
4. HLS Playlist Cache — Gerçekçi Kazanç
v1 Tahmini (İyimser)
100-300ms → 10-20ms (%90+ kazanç)
v2 Düzeltmesi (Gerçekçi)
%30-40 kazanç. Disk I/O kalkar ama regex (URL rewrite + imza) her seferinde yapılmak zorunda
serveHls() her istekte farklı $expires, $token, $sig ekliyor. Cache'lenebilecek olan sadece ham dosya içeriği — regex işlemi her seferinde yapılır.
5. Rate Limiting — ACİL Güvenlik Açığı
Mevcut kodda sadece stream endpoint'inde throttle.user:stream var.
trackStart ve trackHit tamamen açık — kötü niyetli bir script play_count'u şişirebilir.
| Endpoint | Mevcut | Olması Gereken |
|---|---|---|
| stream | throttle var | 30/dakika |
| track-start | YOK! | 60/dakika |
| track-hit | YOK! | 120/dakika |
| recent | YOK! | 30/dakika |
| popular | YOK! | 20/dakika |
Kapsamlı TODO List
Tüm iş kalemleri öncelik sırasıyla. Her grubun sonunda ABA test senaryosu var.
Test ortamı: mztest.muzibu.com
A. Kritik Bug Fix — Şarkı Geçiş Sorunu
Öncelik: EN YÜKSEK — Müşteri şikayeti var
A1. Queue auto-refill güçlendirme
Genre refill başarısız → popular songs → shuffle repeat. nextTrack() satır 2088-2247
A2. _nextTrackInProgress güvenlik zamanlayıcısı (10 sn)
Exception durumunda kilitlenmeyi önle. nextTrack() satır 2011
A3. Stream 401 recovery mekanizması
startCrossfade() error handler satır 2498. Token refresh + retry + user notification
A4. Geçiş loglama (serverLog entegrasyonu)
onTrackEnded, nextTrack, crossfade her adımda log. Debug panel transition logs
A5. Şarkı yarıda kesilme koruması
Preload/crossfade race condition düzeltmesi. _cleanupPreloadedNext() zamanlama
ABA Test — Şarkı Geçiş
🎯 GÖREV: Şarkı Geçiş Testi SENARYO: 1. https://mztest.muzibu.com açın 2. Giriş yapın (premium hesap) 3. Herhangi bir şarkıyı çalın 4. Şarkının bitmesini bekleyin (veya sonuna sarın) 5. Sonraki şarkıya otomatik geçiş olduğunu doğrulayın 6. 5 şarkı art arda geçiş testi (skip + doğal bitiş) 7. Queue sonuna ulaşın — auto-refill olduğunu doğrulayın 8. Console'da hata olup olmadığını kontrol edin BAŞARI KRİTERLERİ: ✅ Şarkı bittiğinde sonrakine 3 sn içinde geçmeli ✅ Yarıda kesilme OLMAMALI ✅ Queue bittiğinde otomatik dolmalı ✅ Console'da critical error olmamalı RAPOR: Geçiş süreleri, hatalar, console logları
B. Debug Mode Yönetimi
Öncelik: YÜKSEK — 180 KB tüm kullanıcıları etkiliyor
B1. performance-debug.js koşullu yükleme (?debug + yetki)
app.blade.php → @if(request()->has('debug') && $isDebugAllowed) ile sar. ?debug yok = dosya yüklenmez
B2. Mobil responsive debug panel
performance-debug.js panel CSS'ini mobil uyumlu yap. Touch-friendly butonlar. ?debug mobilde de çalışmalı
B3. Admin panel debug toggle UI
Kullanıcı yönetimi → Debug aç/kapat butonu + süre belirle (1 saat, 1 gün, 1 hafta)
ABA Test — Debug Mode
🎯 GÖREV: Debug Mode Kontrol Testi SENARYO: 1. https://mztest.muzibu.com — normal kullanıcı ile giriş 2. Network tab'ı aç → performance-debug.js YÜKLENMEMELİ 3. URL'ye ?debug ekle → YİNE yüklenmemeli (yetkisiz) 4. Admin panelden bu kullanıcı için debug aç 5. URL'ye ?debug ekle → performance-debug.js yüklenmeli 6. Debug panel görünmeli (masaüstü + mobil) 7. ?debug olmadan sayfayı aç → yüklenmemeli (yetki var ama parametre yok) BAŞARI KRİTERLERİ: ✅ ?debug YOK → performance-debug.js network request'i YOK ✅ ?debug VAR + yetkisiz → yüklenmez ✅ ?debug VAR + yetkili → panel görünür ve fonksiyonel ✅ Mobilde de panel açılabilir ve kullanılabilir RAPOR: JS boyut farkı, panel screenshot, mobil uyumluluk
C. API Cache & Hızlandırma
v2 GÜNCELLENDİÖncelik: YÜKSEK — Şarkı başlama hızı
C1. isPremium() + getSubscriptionData() birleşik cache (2 saat TTL)
Tek cache key: user_{id}_subscription_data_tenant_{tenant_id} → {is_premium, expires_at}. Mevcut Cache::forget key'i ile uyumlu. Kazanç: ~5-15ms (model stale durumlarında).
C2. recent/popular/lastPlayed cache
SongController.php. recent: 5dk user-based, popular: 30dk global, lastPlayed: 5dk user-based. Cache bust: trackStart içinde.
C3. trackStart kısmi queue (play_id senkron kalır)
Play kaydı INSERT senkron (play_id döner), duplikat kontrolü + cache bust Job'da. Frontend trackHit/trackEnd play_id'ye bağımlı.
C4. HLS playlist ham dosya cache (Redis, regex her seferinde)
SongStreamController::serveHls(). Ham file_get_contents() sonucunu Redis'e al. URL rewrite regex her istekte yapılır ($expires, $token değişken). Kazanç: %30-40.
C5. Rate limiting (throttle) ekle — ACİL
trackStart: 60/dk, trackHit: 120/dk, recent: 30/dk, popular: 20/dk. Mevcut: sadece stream'de var!
ABA Test — Cache & Performans
🎯 GÖREV: Cache Performans Testi
SENARYO:
1. https://mztest.muzibu.com — premium hesap ile giriş
2. Network tab → /api/muzibu/songs/{id}/stream isteğinin süresini ölç
3. Aynı şarkıyı 3 kez çal → ikinci/üçüncü süreyi karşılaştır
4. /api/muzibu/songs/recent süresini ölç → sayfa yenile → tekrar ölç
5. Ödeme simülasyonu: subscription_expires_at'ı güncelle → isPremium cache bust olduğunu doğrula
BAŞARI KRİTERLERİ:
✅ isPremium: 2. çağrı ≤ 5ms (cache'den)
✅ recent: 2. çağrı ≤ 10ms (cache'den)
✅ Ödeme sonrası: cache anında temizlenmiş, yeni sorgu yapılmış
RAPOR: Her endpoint'in önce/sonra süreleri (ms)
D. Format Seçimi & Soft Mode
v2 GÜNCELLENDİÖncelik: ORTA — Altyapı değişikliği gerekli (migration)
D1. Migration: users tablosuna audio_preference + soft_mode kolonları
3 aşamalı onay gerekli! Tenant migration. Default: 'auto'
D2. Migration: corporate_accounts tablosuna audio_preference + soft_mode
3 aşamalı onay gerekli! Tenant migration
D3. ENV: MUZIBU_DEFAULT_AUDIO_FORMAT + MUZIBU_DEFAULT_SOFT_MODE
.env dosyasına ekle. Config dosyası oluştur. Default: 'auto'
D4. Settings: corporate_mp3_threshold (admin panelden ayarlanabilir)
setting('corporate_mp3_threshold', 5). Varsayılan 5 üye. Admin → Ayarlar → Muzibu → Kurumsal MP3 Eşiği
D5. Backend: resolveAudioFormat($user) metodu
4 katmanlı hiyerarşi + kurumsal eşik kontrolü. corporate.members_count >= threshold → MP3
D6. Backend: resolveSoftMode($user) metodu
User model + corporate chain + ENV + cihaz algılama sonucu
D7. Frontend: Cihaz algılama (detectDeviceCapability)
navigator.deviceMemory, hardwareConcurrency, connection.effectiveType kontrol
D8. Frontend: Soft Mode öneri toast
Orta seviye cihazlarda "Hafif Mod Önerisi" bildirimi göster
D9. UI: Player ayarlar ikonu + Soft Mode toggle
Player bar üzerinde dişli ikonu → modal/dropdown → Hafif Mod switch
D10. UI: Profil ayarları sayfasına Çalma Modu bölümü
HLS/MP3/Otomatik seçim + Soft Mode on/off/auto
D11. UI: Kurumsal panel format ayarı + eşik gösterimi
Kurumsal hesap yönetim paneli → Çalma Formatı + Soft Mode ayarları. "5+ üye = otomatik MP3" bilgilendirmesi
ABA Test — Format & Soft Mode
🎯 GÖREV: Format Seçim & Soft Mode Testi SENARYO: 1. https://mztest.muzibu.com — premium hesap 2. Profil → Ayarlar → Çalma Formatı: "MP3" seç → kaydet 3. Şarkı çal → stream_type: "mp3" olduğunu doğrula (network tab) 4. Çalma Formatı: "HLS" seç → şarkı çal → stream_type: "hls" 5. Çalma Formatı: "Otomatik" seç → cihaz algılama tetiklenmeli 6. Player'da dişli ikonu → "Hafif Mod" aç → crossfade 3sn, debug yüklenmez 7. Kurumsal hesapla giriş yap (5+ üyeli) → otomatik MP3 mi kontrol et 8. Bireysel kullanıcı olarak kurumsal MP3'yi "HLS" ile ez BAŞARI KRİTERLERİ: ✅ MP3 seçildiğinde gerçekten MP3 çalıyor ✅ HLS seçildiğinde gerçekten HLS çalıyor ✅ 5+ üyeli kurumsal → otomatik MP3 ✅ Bireysel tercih kurumsal kararı eziyor ✅ Soft Mode açıldığında crossfade 3sn, HLS 32kbps sabit RAPOR: Her mod için network istekleri, stream_type, geçiş süreleri
E. Crossfade Aktivasyonu
v2 GÜNCELLENDİÖncelik: ORTA — Kod hazır, config değişikliği yeterli
E1. Crossfade config backend'den gönder
API response'a soft_config.crossfade + soft_config.crossfade_duration ekle. Normal: 5000ms, Soft: 3000ms
E2. Frontend crossfade toggle
player-core.js satır 865-866: crossfadeEnabled=true, crossfadeDuration mod'a göre dinamik (5sn/3sn)
E3. Soft Mode + crossfade entegrasyonu
Soft Mode aktif → crossfade otomatik açılsın (3 sn — daha az RAM overlap)
E4. Player UI'da crossfade toggle
Ayarlar modalında "Geçişlerde yumuşak geçiş" switch'i
ABA Test — Crossfade
🎯 GÖREV: Crossfade Testi SENARYO: 1. https://mztest.muzibu.com — premium hesap 2. Crossfade KAPALI durumda: Şarkı bitişini bekle → keskin geçiş 3. Player ayarlar → Crossfade AÇ 4. Normal mod: Şarkıyı sonuna sar → 5 sn yumuşak geçiş 5. Soft Mode AÇ → tekrar geçiş → 3 sn yumuşak geçiş 6. Skip butonu ile geçiş → crossfade tetiklenmeli 7. 5 şarkı art arda crossfade ile geçiş 8. Ses kesilmesi veya çift çalma olmamalı BAŞARI KRİTERLERİ: ✅ Normal mod: Fade out/in 5 sn içinde tamamlanmalı ✅ Soft mod: Fade out/in 3 sn içinde tamamlanmalı ✅ İki şarkı aynı anda duyulabilir (overlap dönemi) ✅ Ses kesilmesi yok ✅ Volume tutarlı (yeni şarkı aynı volume'da) RAPOR: Geçiş süreleri, mod farkı, ses kalitesi notları
F. Sonsuz Çalma Döngüsü (Continuous Play)
Öncelik: YÜKSEK — Müşteri beklentisi: "Açtım, gün boyu çalsın"
F1. Queue refill fallback zinciri güçlendirme
Genre → Popular → Random → Repeat Queue. Hiçbir durumda durmamalı
F2. Arka plan tab koruması
Tarayıcı arka planda timer throttle ediyor → Web Worker veya Audio Worklet ile koruma
F3. Session keepalive mekanizması
Uzun süreli çalmada auth token expire olmamalı. Periyodik ping/refresh
F4. Memory leak temizliği
Uzun süre çalışınca birikecek: eski Howl/HLS instance'ları, event listener'lar, blob URL'ler
ABA Test — Sonsuz Çalma
🎯 GÖREV: Sonsuz Çalma Dayanıklılık Testi SENARYO: 1. https://mztest.muzibu.com — premium hesap 2. Bir şarkı çalın, 30 dakika boyunca çalmaya bırakın 3. Bu sürede: sayfa arka plana alın (başka tab açın) 4. 30 dk sonra dönün — müzik hâlâ çalıyor mu? 5. Queue'nun otomatik dolduğunu doğrulayın 6. Tarayıcı bellek kullanımını not edin (başlangıç vs 30dk sonra) BAŞARI KRİTERLERİ: ✅ 30 dakika kesintisiz çalma ✅ Arka plan tab'da devam ediyor ✅ Queue otomatik dolmuş (10+ şarkı art arda geçmiş) ✅ Bellek sızıntısı yok (±20MB tolerans) RAPOR: Çalma süresi, geçiş sayısı, bellek kullanımı, hatalar
Uygulama Sırası
v2 GÜNCELLENDİ| Sıra | İş | Kalem | Migration | Neden |
|---|---|---|---|---|
| 1 | A Şarkı Geçiş Fix | 5 | Hayır | Müşteri şikayeti, acil |
| 2 | B Debug koşullu yükleme | 3 | Hayır | 180 KB tasarruf, tek satır |
| 3 | C1 isPremium + getSubscriptionData fix | 1 | Hayır | Her şarkıda 2 DB sorgusu kalkacak |
| 4 | C2-C4 API cache + playlist cache | 3 | Hayır | Sayfa açılış hızı |
| 5 | C5 Rate limiting | 1 | Hayır | Güvenlik açığı! |
| 6 | C3 trackStart kısmi queue | 1 | Hayır | Performans |
| 7 | E Crossfade aktivasyonu | 4 | Hayır | Kod hazır, 5sn/3sn |
| 8 | F Sonsuz çalma koruması | 4 | Hayır | Uzun süreli kullanım |
| 9 | D Format & Soft Mode (migration) | 11 | EVET (4 kolon) | En son, en büyük |
| TOPLAM | 33 iş kalemi | 4 migration | 6 ABA test | |
Strateji: Migration gerektirmeyen gruplar (A, B, C, E, F) önce yapılır — hızlı deploy. Migration gerektirenler (D) en son — 3 aşamalı onay süreci. Rate limiting (C5) güvenlik açığı olduğu için öne alındı.