Tüm Raporlar / Uygulama Planı

Kapsamlı Uygulama Planı & TODO

Tüm kararlar, iş kalemleri ve ABA test senaryoları

v2 — Güncellenmiş 21 Şubat 2026 Şarkı Geçiş Sorunu Soft Mode Format Seçimi Test: mztest.muzibu.com

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):

1

audio.onended veya timeupdate fallback (Safari)

Satır 2758 (HLS onended) — Satır 5754-5796 (Safari fallback: son 0.5 sn'de tetiklenir)

2

onTrackEnded() çağrılır

Satır 2964-3040 — Debounce: 1 sn içinde tekrar çağrılmayı engeller

3

nextTrack(true) çağrılır — gapless geçiş

Satır 2011-2248 — Concurrent guard: _nextTrackInProgress + 300ms debounce

4a

Queue'da sonraki şarkı VAR → playSongFromQueue()

Normal akış — sorun burada değil

4b

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)

YÜKSEK İHTİMAL 1. Queue boşalınca auto-refill başarısız

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.

YÜKSEK İHTİMAL 2. Stream API 401/403 yanıtı (oturum düş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.

ORTA İHTİMAL 3. HLS.js buffer hatası (bufferAppendError)

Crossfade sırasında yeni HLS player'ın buffer'ı append edemezse → fatal error → player durur. Özellikle eski cihazlarda MediaSource API sınırlaması.

ORTA İHTİMAL 4. _nextTrackInProgress kilidi kalkmamış

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.

DÜŞÜK İHTİMAL 5. Safari'de onended tetiklenmiyor

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.

DÜŞÜK İHTİMAL 6. Crossfade timeout yarışı

4 sn crossfade timeout'u tamamlanmadan şarkı biterse (çok kısa şarkı) veya completeCrossfade() hatası.

DÜŞÜK İHTİMAL 7. Şarkı yarıda kesilme → Preload race condition

Preload ve crossfade aynı anda tetiklenirse, preload cleanup yeni player'ı da bozabilir. _cleanupPreloadedNext() zamanlama sorunu.

Düzeltme Planı

FIX-1 Auto-refill güçlendirme

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.

FIX-2 _nextTrackInProgress güvenlik zamanlayıcısı

10 sn sonra otomatik reset: setTimeout(() => this._nextTrackInProgress = false, 10000). Exception durumunda kilitlenmeyi önler.

FIX-3 Stream 401 recovery

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").

FIX-4 Geçiş loglama

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

Kullanıcıya sormadan AÇ

Öneri Göster

RAM < 4GB veya CPU < 4 çekirdek

Toast bildirim → "Etkinleştir" butonu

Normal Mod

RAM ≥ 4GB ve CPU ≥ 4 ve 3G+

Hiçbir şey yapma, mevcut davranış

Manuel Kontrol (Her Zaman Erişilebilir)

Player ayarlar ikonu: Player bar üzerinde dişli ikonu → "Hafif Mod" switch → anında geçiş, sayfa yenileme yok
Profil ayarları: /profile/settings → "Çalma Modu" bölümü → kalıcı tercih, oturum açıldığında hatırlanır

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ış

KURAL 1

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.

KURAL 2 v2 DEĞİŞTİ

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.

// app.blade.php — Yeni kontrol
@if(request()->has('debug') && $isDebugAllowed)
<script src="/themes/muzibu/js/player/features/performance-debug.js"></script>
@endif
// ?debug yok → dosya yüklenmez (root dahil)
// ?debug var ama yetkisiz → dosya yüklenmez
// ?debug var + yetkili → dosya yüklenir, panel görünür
KURAL 3

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.

KURAL 4

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.

Varsayılan Eşik
5 üye
Ayar Yeri
Admin Panel (Settings)
Setting Key
corporate_mp3_threshold
// 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
32 kbps
ultralow — Mono, 22 kHz

autoLevelCapping = 0 SABİT. ABR serbest bırakılmaz, en düşük kalitede kalır. Gerekirse kullanıcı manuel yükseltebilir.

Normal Mod
128 kbps
mid — Stereo, 44.1 kHz

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}
// User.php satır 454-472 — Mevcut isPremium()
// 1. Model değeri (hızlı — DB'ye GİTMEZ)
if ($this->subscription_expires_at && $this->subscription_expires_at->isFuture())
return true; // Çoğu durumda buradan döner
// 2. Fresh DB kontrolü (model stale olabilir)
$freshExpiry = DB::table('users')...value('subscription_expires_at');
// ↑ Sadece model boş veya expired ise buraya gelir

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.

Cache key: user_{id}_subscription_data_tenant_{tenant_id} → {is_premium, expires_at}

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ı.