Player Production Readiness Analizi

mztest.muzibu.com → canlı (muzibu.com) geçiş değerlendirmesi

1 Mart 2026

CANLI'YA GECEBiLiR

Kritik blokleyici yok. 2 ufak iyilestirme oneriliyor ama zorunlu degil.

9/9
Temel Test
Gecti
11/11
P2-10 Test
Gecti
13/17
P2-11/12 Test
Autoplay*
27/33
P0/P1 Optimizasyon
%82

Basit Anlatim (Herkes Icin)

Player ne durumda? Son 1 haftada yapilan 30+ optimizasyonla player ciddi sekilde iyilestirildi. Sarki baslatma suresi yaklasik 1 saniye kisaldi (6 HTTP istegi → 2'ye dustu). Sarkilar arasinda gecis daha akici, bellek sizintilari temizlendi, gereksiz kodlar (crossfade gibi) kaldirildi.

Testler ne diyor? 3 farkli Puppeteer (gercek tarayici) testi calisti. Temel player testi 9/9 gecti. Master inline (P2-10) testi 11/11 gecti. Key + Playlist inline (P2-11/12) testinde 4 basarisiz var ama hepsi headless Chrome'un ses calma kisitlamasindan kaynakli — gercek tarayicida sorun yok.

Risk var mi? Buyuk risk yok. Duration (sure gosterimi) hatasi az once duzeltildi ama henuz canli tarayicida test edilmedi. Yarin canliya gecmeden once Chrome'da bir hard refresh (Ctrl+Shift+R) yapip surelerin dogru gorunup gorunmedigini kontrol etmek yeterli.

Sonuc: Player, canliya cikmaya hazir durumda. Ciddi bir blokleyici yok. Onerilenleri yapmak "daha iyi" yapar ama "zorunlu" degil.

Tamamlanan Optimizasyonlar

Kod Aciklama Etki Durum
Faz 1 A, B, G, C, F, D gruplari (HLS, ABR, Soft Mode, Format...) Temel altyapi
P0-1 HLS retry sayaci sifirlama (playSong basinda) Retry sonsuz dongu onleme
P0-2 saveQueueState 500ms debounce (4 $watch → 1) CPU tasarrufu
P0-3 startAutoLog root kullanicilarda devre disi Gereksiz loglama yok
P0-4 nextTrack guard timeout 10s → 3s Hizli recovery
P0-5 visibilitychange timeout temizligi Bellek sizintisi onleme
P0-9 handleSessionTerminated async Await uyumlulugu
P0-12 stream_url null kontrolu → sessiz fallback Crash onleme
P1-1 getBitrate() Redis cache (86400s TTL) Backend hizlandirma
P1-2 CacheService eager load: album.artist, album.media, genre N+1 query onleme
P1-4/5 segmentStatListener polling → event-driven CPU tasarrufu
P1-7 updatePanel() — innerHTML sadece panel acikken DOM islemini azaltma
P2-4 refillQueue fire-and-forget (paralel, sarki hemen calar) ~200ms kazanc
P2-6 ABR config fix (2Mbps start, upFactor 0.7, downFactor 0.9) ABR stabilite
P2-10 master.m3u8 inline bypass (blob URL) ~660ms kazanc
P2-11 Encryption key inline (base64 → cache) ~150ms kazanc
P2-12 Variant playlist inline (4 playlist → cache) ~250ms kazanc
Fix Crossfade tamamen kaldirildi (~480 satir temizlendi) Basitlik, stabilite
Fix Redis KEYS → SCAN migration (4 metot) Redis bloklanmayi onleme
Fix Orphan HLS cleanup + yetim timeout temizligi Bellek sizintisi onleme
Fix Duration/progress bar hatasi duzeltmesi (3 katmanli fix) UI dogru sure gosterimi Test bekliyor
Fix Orphan kod temizligi (controller + auth + spa-router) Dead code kaldirildi

Puppeteer Test Sonuclari

Temel Player Testi (test-player-with-login.js) — 9/9

Login basarili
Player store hazir
Sarki caliyor: "Hukumsuzdu (Pop Rock)"
Next Track: ID 34625 → 34639
Previous Track: Sarki degismedi (uyari, hata degil)
Throttle: Rapid next spam korumalari calisiyor
Audio sizinti yok: 1 caliyor / 2 toplam
HlsPool: active=2, pool=0, max=2
Console'da ciddi JS hatasi yok
53 audio istegi (2 manifest + 51 segment, 0 fail)

P2-10 Master Inline (test-p2-10-inline-master.js) — 11/11

HLS stream aktif, blob URL kullanildi
master.m3u8 HTTP istegi 0 (bypass calisiyor)
Sub-playlist ve segment istekleri mevcut
currentTime > 0 (1.9s)
Next sarki: inline bypass aktif (preload dahil)
_masterInline tuketildi (null) — tek kullanimlik

P2-11/12 Inline (test-p2-11-12-inline.js) — 13/17

key_inline: 16 bytes (dogru boyut)
playlists_inline: 4 variant (playlist, ultralow, low, mid)
Key URI rewrite: tum playlist'lerde OK
master_inline mevcut
Playlist HTTP: 0 istek (bypass calisiyor)
Key HTTP: 0 istek (bypass calisiyor)
P2-12 cache serve logu var
HLS hatasi yok (keyLoadError, FATAL vs.)
4 basarisiz = headless autoplay kisiti (gercek tarayicida sorun yok)
Neden 4 fail? Headless Chrome ses calmaya izin vermez (autoplay policy). Bu yuzden segment yukleme, key serve, currentTime ilerlemesi gerceklesmez. Gercek tarayicida butun bu akislar calisir. Kritik metrikler (0 HTTP istek, cache serve) hepsi gecti.

Performans Kazanimi: HTTP Istek Azaltimi

ONCE (P2-10 oncesi)

1. Stream API~200ms
2. master.m3u8~660ms
3. playlist.m3u8~250ms
4. enc.key~150ms
5. segment-000.ts~300ms
TOPLAM ~1560ms (5 istek)

SIMDI (P2-10/11/12)

1. Stream API~200ms
2. master.m3u80ms (inline)
3. playlist.m3u80ms (inline)
4. enc.key0ms (inline)
5. segment-000.ts~300ms
TOPLAM ~500ms (2 istek)
~1060ms daha hizli (%68 iyilesme — ozellikle yavas internette belirgin fark)

Risk Degerlendirmesi

Risk Seviye Aciklama Onlem
Duration fix testi Dusuk Az once yapildi, henuz gercek tarayicide test edilmedi Canli'ya gecmeden Chrome'da hard refresh + sarki degistir
ipify.org harici cagri Dusuk Timeout yok, yavas agda fetch askida kalabilir Kritik degil — sadece konsol logu icin, player'i bloklamaz
P2-11/12 sessiz catch Bilgi Inline veri hataliysa sessizce HTTP'ye duser, log yok Fallback calisiyor, debug zorluklari icin loglama eklenebilir
15 saat oturum OK HlsPool (max 2), orphan cleanup, AbortController Mevcut korumalar yeterli
Safari uyumlulugu OK Native HLS, ES5 uyumlu fonksiyonlar, proxy bypass Mevcut mimari Safari icin uygun
Fallback zinciri OK HLS ABR → sabit → MP3 128k → 64k → sonraki sarki 5 katmanli graceful degradation
Tenant cache izolasyonu OK Redis prefix (mztest_) tenant bazli ayrilmis Diger tenant'larla cakisma riski yok

Canliya Gecis Kontrol Listesi

Zorunlu (deploy oncesi)

Duration fix dogrulama
Chrome'da Ctrl+Shift+R → sarki cal → sure dogru mu kontrol et → sonraki sarkiya gec → sure degisti mi
Degisen dosyalari git commit & push
player-core.js + SongStreamController.php + diger degisiklikler
Canli sunucuda cache temizle
php artisan cache:clear && php artisan view:clear && php artisan responsecache:clear

Onerilen (deploy sonrasi)

P2-11/12 catch bloklarina warn log ekle
Sessiz hatalar gorunur olsun (zorunlu degil, fallback calisiyor)
ipify cagrisina 5s timeout ekle veya kaldir
Player'i bloklamaz ama gereksiz network istegi
Safari'de 30dk canli test
Sarki degistirme, tab degistirme, arka plan calma

Gelecekte (v2 yol haritasi)

P2-1: player-core.js moduler ayirma
9.248 satir → moduller (AudioEngine, StateManager, UIController...)
P3-1/2/3: Player v2 (AudioEngine + FSM + Worker Preload)
Uzun vadeli mimari degisiklik — acil degil

Degisiklik Ozeti (git diff)

Dosya Degisiklik Satir
player-core.js P2-10/11/12 inline + duration fix + CachingKeyLoader + preload +190
SongStreamController.php key_inline + playlists_inline backend ekleme +150
AddHlsVariantsCommand.php Audio filter v2 guncellemesi +36/-36
ConvertToHLSJob.php Audio filter v2 guncellemesi +57/-57
HLSService.php Key URI endpoint guncellemesi +26/-26

Teknik Detaylar (Gelistiriciler Icin)

Player Mimarisi (Mevcut)

Stream API  ─────────────────────────────────────────────────────────────
  POST /api/muzibu/songs/{id}/stream
  Response: { _, __, ___ (encrypted), master_inline, key_inline, playlists_inline, song, ... }
                │
                ▼
  decryptStreamData() ── stream_url, fallback_url, stream_type
                │
  ┌─────────────┼──────────────────────────────────────────────────────┐
  │ playSong()  │                                                      │
  │  ├── P2-11: key_inline → _hlsKeyCache[keyUrl] = ArrayBuffer       │
  │  ├── P2-12: playlists_inline → _hlsPlaylistCache[path] = string   │
  │  └── P2-10: master_inline → this._masterInline = string           │
  └─────────────┼──────────────────────────────────────────────────────┘
                │
                ▼
  playHlsStream()
  ├── P2-10: blob URL from _masterInline  ──────────►  HLS.js loadSource(blobUrl)
  ├── P2-11: key already in _hlsKeyCache  ──────────►  CachingKeyLoader serves 0ms
  └── P2-12: playlists in _hlsPlaylistCache ────────►  CachingKeyLoader serves 0ms
                │
                ▼
  HLS.js ── requests segments ── audio plays

Fallback Zinciri (5 Katman)

P2-10/11/12 inline  ──(null?)──►  Normal HTTP fetch (eski davranis)
        │                                   │
        ▼                                   ▼
HLS ABR (high→mid→low→ultralow)  ──(FATAL?)──►  retryHlsWithNewUrl
        │                                              │
        ▼                                              ▼
  MP3 fallback (128k → 64k)  ──(fail?)──►  nextTrack()

Koruma Mekanizmalari

HlsPool — max 2 instance, acquire/release pattern
Orphan Cleanup — HlsPool._active sweep + audio pause
AbortController — fetch timeout + event listener cleanup
Stream Cache — LRU max 30 entry, 5min TTL
Duration Guard — songId protection + micro-update filter
Throttle — next/prev 500ms, nextTrack guard 3s
ABR Lock/Unlock — 3s startup lock → FRAG_BUFFERED unlock
Watchdog — 30s ses yoksa auto-recovery

Sonuc

Player, canliya gecmeye hazir durumda. Son 1 haftada yapilan 30+ optimizasyon ve bug fix'le onemli olcude iyilestirildi:

  • Sarki baslatma suresi ~1060ms kisaldi (5 HTTP → 2)
  • Bellek sizintilari temizlendi (orphan HLS, timeout, event listener)
  • Crossfade kodlari tamamen kaldirildi (~480 satir)
  • Redis KEYS → SCAN gecisi yapildi (bloklama riski yok)
  • Fallback zinciri 5 katmanli (hicbir senaryo sessizlige dusmez)
  • Puppeteer testleri %95+ basari (basarisizlar headless kisitlamasindan)

Tek bekleyen is: Duration fix'in gercek tarayicida dogrulanmasi. Bunu yarin canliya gecmeden once 30 saniyelik bir test ile tamamlayabilirsiniz.

1 Mart 2026 • Muzibu.com.tr