Player Core Analiz Raporu

Komple Yeniden Yazım icin Detayli Referans

player-core.js • 9.186 satir • ~420 KB

Icerik Haritasi

Basit Anlatim (Herkes Icin)

Bu dosya, Muzibu muzik platformunun kalbidir. Siteye girdiginizde sarki calma, durdurma, sonraki sarkiya gecme, ses ayarlama gibi TUM islemleri bu tek dosya yapiyor.

Dosya 9.186 satir uzunlugundadir ve icinde yaklasik 120+ fonksiyon vardir. Normalde boyle buyuk bir dosya 10-15 kucuk dosyaya bolunmelidir. Su an her sey tek dosyada toplandigi icin bakimi ve guncellemesi cok zordur.

Neden Onemli? Yeniden yazim (rewrite) yapilacaksa, bu dosyadaki her mekanizmanin ne yaptigini bilmek gerekir. Bu rapor, her fonksiyonu, her state degiskenini ve her event handler'i tek tek listeleyerek yeniden yazim icin tam bir referans saglar.

1. Mimari Genel Bakis

1.1 Dosya Yapisi

Tek bir Alpine.js component (muzibuApp()) icinde her sey tanimli. Modullerin spread ile aktarildigi monolitik yapi:

player-core.js (9.186 satir)
|
|-- Satirlar 1-36      : ensureHlsJs() - HLS.js lazy loader
|-- Satirlar 38-109    : Debug sistemi (pLog, pWarn, console uyari)
|-- Satirlar 111-163   : Cihaz algilama + _mzParam test helper
|-- Satirlar 165-261   : playerDebug(), safeAudioCleanup(), createHlsBlobUrl()
|-- Satirlar 263-315   : Blob URL takibi, XOR decrypt, decryptStreamData()
|-- Satirlar 317-455   : HLS key on-bellek: _hlsKeyCache, CachingKeyLoader
|-- Satirlar 457-678   : HlsPool yoneticisi (2 instance havuz)
|-- Satirlar 680-780   : serverLog() - sunucu tarafli hata loglama
|-- Satirlar 781-9179  : muzibuApp() - ANA COMPONENT
    |-- 781-860   : Spread modules + config + auth state
    |-- 860-940   : Player state degiskenleri (~60 adet)
    |-- 940-1060  : getCoverUrl, updatePlayerColors, getActiveHlsAudio
    |-- 1062-1190 : authenticatedFetch, LRU stream cache, _ensureHlsReady
    |-- 1192-1310 : init() - baslangic fonksiyonu
    |-- 1310-1515 : animateDurationCounter, loadFeaturedPlaylists, preloadLastPlayedSong
    |-- 1519-1718 : togglePlayPause
    |-- 1720-1823 : playRandomSongs, fallbackToPopularSongs
    |-- 1825-2006 : saveQueueState, loadQueueState, loadInitialQueue
    |-- 2008-2406 : loadEmergencyQueue, previousTrack, nextTrack, _safePlayFromQueue, _refillQueue
    |-- 2408-2498 : toggleLike, toggleMute
    |-- 2500-2976 : Crossfade: startCrossfade, createNextHowlerPlayer, createNextHlsPlayer
    |-- 2978-3158 : completeCrossfade, seekTo
    |-- 3160-3697 : Volume, onTrackEnded, Watchdog v3, Spot Player
    |-- 3699-3844 : MediaSession, seekRelative, playContext
    |-- 3846-4382 : playAlbum, playPlaylist, playGenre, playSector, playRadio, playSong
    |-- 4384-5317 : playSongFromQueue (3 yol: preloaded/takeover/fresh)
    |-- 5319-5604 : stopCurrentPlayback, playWithHowler
    |-- 5606-6612 : playHlsStream (tum HLS mantigi)
    |-- 6614-6858 : retryHlsWithNewUrl, triggerMp3Fallback, fadeAudioElement, progress tracking
    |-- 6860-7311 : SPA navigasyon, sarki izleme (track-start/hit/end), kuyruk islemleri
    |-- 7313-7816 : Auth (login/register/forgot), tema, drag-and-drop
    |-- 7818-8340 : Preload sistemi (3 sarki + hover + next song HLS preload)
    |-- 8340-8523 : Buffer saglik sistemi (devre disi)
    |-- 8525-9179 : refreshHlsUrl, queue monitor, background playback, session terminated

1.2 Bagimliliklar (Dependencies)

ModulDosyaSpread Yontemi
muzibuFavoritesfeatures/favorites.js...muzibuFavorites()
muzibuAuthfeatures/auth.js (tahmini)...muzibuAuth()
MuzibuApifeatures/api.js...(window.MuzibuApi || {})
MuzibuSessionfeatures/session.js...(window.MuzibuSession || {})
MuzibuSpaRouterfeatures/spa-router.js...(window.MuzibuSpaRouter || {})
debugFeaturefeatures/performance-debug.js...(window.debugFeature || {})
safeStoragecore/safe-storage.jsGlobal erisim
Hlslib/hls.min.js (lazy)Dinamik script ekleme
HowlHowler.js (global)window.Howl
MuzibuSpotPlayerfeatures/spot-player.jswindow.MuzibuSpotPlayer
MuzibuDeviceProfilerfeatures/device-profiler.jswindow.MuzibuDeviceProfiler

1.3 Tasarim Desenleri

DesenKullanimKonum
Object PoolHlsPool - 2 HLS.js instance havuzuSatir 457-678
LRU CacheStream URL cache (max 30, 5dk TTL)Satir 1148-1176
Lazy LoadingHLS.js script + pool ilk kullanimda yuklenirSatir 14-36, 1178-1190
BlacklistBasarisiz sarkilar 5dk boyunca atlanirSatir 7998-8026
Concurrent GuardnextTrack, queue refill, auth error icin tekil calismaSatirlar 2100+
DebouncetogglePlayPause, onTrackEnded, trackSongStartCesitli

2. Baslatma Akisi (Initialization)

2.1 init() Fonksiyonu (Satir 1192-1310)

Alpine.js x-init ile cagrilan ana baslangic fonksiyonu. Sira:

  1. Double-init guard_initialized flag kontrolu
  2. window._player — Console debug arayuzu olusturma (proxy-safe)
  3. HLS Pool lazy init_hlsPoolReady = false, beforeunload'da destroyAll
  4. loadFeaturedPlaylists() — 300ms gecikmeyle (rate-limit onleme)
  5. isLoading = false — Icerik hemen gorunsun (no delay)
  6. startQueueMonitor() — 10sn interval ile kuyruk kontrolu
  7. enableBackgroundPlayback() — visibilitychange + online/offline handler
  8. clearPlayerState() — localStorage temizle (her yenilemede temiz baslangic)
  9. loadInitialQueue() — API'den kuyruk yukle (3 retry, exponential backoff)
  10. MuzibuDeviceProfiler.init() — Cihaz profili (loggedIn ise)
  11. Buffer Monitor — Devre disi (bufferHealthEnabled=false)
  12. SPA Router — Geri/ileri buton handler (popstate)
  13. preloadLastPlayedSong() — localStorage'dan son sarkiyi goster (ama calma)
  14. $watch duration — Animasyonlu sure gosterimi
  15. setupAutoSave() — queue/volume degisikliklerini $watch ile kaydet

2.2 Global (Module-Level) Baslatma

muzibuApp() disinda, dosya yuklendiginde hemen calisan kodlar:

_hlsJsLoadedHLS.js global var kontrolu
_MZ_DBGDebug modu (debug=1 param veya localhost)
Console uyari IIFEDevTools acanlar icin korkutucu mesaj + fingerprint
_hlsKeyCacheHLS key on-bellek Map'i
HlsPool objesiPool singleton (ama init() henuz cagrilmaz)
activeBlobUrlsBlob URL takip Set'i (memory leak onleme)

3. Oynatma Akisi (Playback Flow)

3.1 Oynatma Tetikleyicileri

FonksiyonSatirAciklama
playSong(song)4200+Tek sarki cal — context otomatik algilar, kuyrugun basina ekler
playAlbum(albumId)3846+Album sarkilarini yukle, kuyruga at, cal
playPlaylist(playlistId)3880+Playlist yukle, shuffle, min 15 sarki (genre'den tamamla)
playGenre(genreId)3960+Tur sarkilarini yukle ve cal
playSector(sectorId)4080+Sektor sarkilarini yukle ve cal
playRadio(radioId)4120+Radyo sarkilarini yukle, shuffle, cal
playFromQueue(index)7200+Kuyruktaki belirli index'i cal
togglePlayPause()1519Dur/devam toggle — premium/guest kontrol, debounce

3.2 Ana Oynatma Zinciri

Kullanici tiklar
    |
    v
playSong() / playAlbum() / playPlaylist() / ...
    |
    v
Kuyruktaki index belirlenir
    |
    v
playSongFromQueue(index) ← ANA FONKSIYON (Satir 4384-5317, ~930 satir!)
    |
    +--[1] Preloaded Ready Path: _preloadedNext.ready === true
    |      HLS instance + audio element dogrudan devralinir (gapless)
    |
    +--[2] Preload Takeover Path: _preloadedNext var ama ready degil
    |      Preload'un HLS'ini bekle veya tamamla
    |
    +--[3] Fresh Load Path: Preload yok
           |
           v
           Stream URL al (cache veya API)
           |
           v
           decryptStreamData() — XOR + Base64 decode
           |
           +--> stream_type === 'hls' --> playHlsStream()
           |
           +--> stream_type === 'mp3' --> playWithHowler()

3.3 Tum Playback Fonksiyonlari

FonksiyonSatirAciklama
playSongFromQueue(index, autoplay)4384Ana oynatma — 3 yol (preloaded/takeover/fresh), ~930 satir
playHlsStream(url, vol, autoplay, isRetry, startPos)5606HLS.js ile calma — 1000+ satir, Alpine proxy bypass
playWithHowler(url, vol, autoplay)5500+Howler.js ile MP3 calma
loadAndPlaySong(songId)5380+Stream URL al ve HLS/MP3'e yonlendir
stopCurrentPlayback()5319Her seyi durdur — HLS pool release, blob cleanup, Howler stop
togglePlayPause()1519Dur/devam — crossfade sirasinda ozel davranis
previousTrack()2070+Onceki sarki (3sn kuralı: basladaysa basa sar)
nextTrack(fromNaturalEnd)2120+Sonraki — concurrent guard, 10sn timeout, double-trigger guard
_safePlayFromQueue(index)2250+nextTrack icinden cagrilan guvenli oynatma, auth token yenileme
onTrackEnded(fromOnended)3248Sarki bitti — spot kontrolu, debounce, dogal son vs kullanici durma
seekTo(percent)3100+Pozisyon degistir — event/number destek, 3sn fallback timeout
seekRelative(seconds)3750+Goreceli atlama (+/-N saniye)
retryHlsWithNewUrl()6614HLS hatasi sonrasi yeni signed URL ile tekrar dene
triggerMp3Fallback()6650+HLS basarisiz → MP3'e gec
refreshHlsUrlForCurrentSong(applyToActive)8525Canli URL yenileme + HLS swap

4. HLS Entegrasyonu

4.1 HLS.js Lazy Loading

ensureHlsJs() (Satir 17-36): HLS.js kutuphanesi sayfa yuklendiginde degil, ilk ihtiyac aninda yuklenir.

4.2 HlsPool — Instance Havuzu (Satir 457-678)

2 adet HLS.js instance'i havuzda tutar. Her release() aslinda destroy + yeniden olustur yapar (MediaSource sifirlamasi icin).

HlsPool.init(config)Havuzu baslat — 2 instance olustur, _trackId takibi
HlsPool.acquire()Havuzdan bir instance al — Alpine proxy bypass icin _trackId kullanir
HlsPool.release(instance)Instance'i yok et ve havuza yenisini koy (tam sifirlama)
HlsPool.taint(instance)Hata durumunda instance'i "kirli" isaretle
HlsPool.destroyAll()Tum instance'lari yok et (beforeunload'da)
HlsPool.status()Havuz durumu: toplam, kullanilan, hazir

4.3 CachingKeyLoader (Satir 317-455)

HLS sifreleme anahtarlarini bellekte onbellegeleyen loader. queueMicrotask() ile asenkron cache-serve yaparak "decryptdata unset" hatasini onler.

_hlsKeyCacheMap<normalizedUrl, ArrayBuffer> — Global key cache
normalizeKeyUrl(url)URL'deki expires/signature parametrelerini cikar → sabit key
constructKeyUrl(songId)/hls-key/muzibu/songs/{id} formatinda URL olustur
prefetchHlsKey(songId)Sarki calma oncesi anahtari bellege yukle
CachingKeyLoader.load()Cache'de varsa queueMicrotask ile serve, yoksa XHR ile yukle + cache'e at

4.4 ABR (Adaptive Bitrate) Stratejisi

Sarkı baslarken en yuksek kalite (level 3 = high) zorlanir, sonra ABR serbest birakilir:

BASLANGIC:
  hls.currentLevel = startLevel (genelde 3=high)
  hls.autoLevelCapping = startLevel

SERBEST BIRAKMA (2 kosuldan hangisi once olursa):
  1. FRAG_BUFFERED event'i → autoLevelCapping = -1
  2. 5 saniye timeout → autoLevelCapping = -1
  (currentLevel DEGISTIRILMEZ — pause yok!)

SOFT MODE (hls_soft):
  autoLevelCapping = 2 (max mid, high filtrelenir)

Seviyeler: 0=ultralow(32k), 1=low(64k), 2=mid(128k), 3=high(orijinal)

4.5 playHlsStream() Detay (Satir 5606-6612)

~1000 satirlik dev fonksiyon. Onemli noktalar:

5. Howler.js Entegrasyonu

5.1 playWithHowler() (Satir ~5500-5604)

MP3 fallback modu. HLS basarisiz oldugunda veya format mp3 ise kullanilir:

Not: Howler kullanimi giderek azaliyor, HLS ana yontem. MP3 sadece fallback.

6. Crossfade Sistemi

6.1 Yapisi ve Yaklasimi

Iki sarki arasi yumusak ses gecisi. Crossfade suresi config'den gelir (varsayilan 7000ms).

TETIKLEME:
  startProgressTracking() veya timeupdate event'inde:
    kalan_sure <= crossfadeDuration/1000 VE !isCrossfading
    → startCrossfade()

AKIS:
  startCrossfade() (Satir 2510)
    |
    +--[Preload hazir] → Preload'un HLS + audio'sunu dogrudan kullan
    |                     removeAllListeners() + sahiplik aktar
    |                     nextAudio.volume = 0 → play() → fadeIn
    |
    +--[Preload yok]  → Stream URL al → createNextHlsPlayer() veya createNextHowlerPlayer()
    |
    v
  Eski player'i fade-out (rAF tabanli), yeni player'i fade-in
  UI hemen guncellenir (yeni sarki bilgisi + progress bar)
    |
    v
  completeCrossfade() (crossfadeDuration sonrasi)
    Eski player yok edilir, yeni player this.hls/this.howl olur
    activeHlsAudioId degistirilir
    Progress tracking yeni player'a baglanir

6.2 Crossfade Fonksiyonlari

startCrossfade()2510Ana baslatici — guard'lar, preload reuse, fresh create, UI guncelleme
createNextHowlerPlayer(url, vol)2750+Howler ile sonraki sarki icin player olustur
createNextHlsPlayer(url, vol)2800+HLS ile sonraki — pool acquire, key prefetch, ABR lock
completeCrossfade()2978Gecis tamamla — eski yok et, yeni'yi ana yap, blob temizle
fadeAudioElement(el, from, to, dur)6720+requestAnimationFrame tabanli yumusak ses gecisi

6.3 Crossfade State Degiskenleri

crossfadeEnabledtrueCrossfade aktif mi
crossfadeDuration7000Gecis suresi (ms) — config'den
isCrossfadingfalseSu an gecis yapiliyor mu
crossfadeTimeoutIdnullcompleteCrossfade timeout ID
crossfadeNextIndex-1Gecis yapilan sonraki index
howlNextnullSonraki sarki Howler instance
hlsNextnullSonraki sarki HLS instance
nextHlsAudioId-Sonraki HLS audio element ID (runtime)

7. Kuyruk Yonetimi (Queue)

7.1 Kuyruk Fonksiyonlari

FonksiyonSatirAciklama
loadInitialQueue()1920+Sayfa acilisinda kuyruk yukle — 3 retry, exponential backoff
loadEmergencyQueue()2008Acil durum — populer → genre fallback
addToQueue(song)7180+Kuyruga sarki ekle (sonuna)
removeFromQueue(index)7200+Kuyruktan cikar (current index ayarla)
clearQueue()7220+Tum kuyrugu temizle
playFromQueue(index)7240+Belirli index'i cal
cleanQueue()7680+Kuyruktan duplicate'leri temizle
saveQueueState()1825localStorage'a kaydet — minimal 22 sarki (current +-10)
loadQueueState()1890+localStorage'dan geri yukle — sadece UI, stream istegi yok
startQueueMonitor()857610sn interval ile kuyruk kontrolu
checkAndRefillQueue()85963 sarkiya dustuyse otomatik doldur
_refillQueue()2300+Genre → Popular → Shuffle Repeat zinciri
_fetchUniqueGenreSongs()2380+Kuyrukta olmayan genre sarkilarini getir
getNextSongIndex()2502Sonraki sarki index'i (-1 = yok)
shuffleArray(array)4160+Fisher-Yates shuffle

7.2 Otomatik Doldurma Zinciri

checkAndRefillQueue() — her 10sn
    |
    kalan sarki <= 3?
    |
    v
_refillQueue()
    |
    +--[1] Genre sarkisi al (currentSong.genre_id'den)
    |      API: /api/muzibu/songs/random?genre_id=X&limit=15
    |
    +--[2] Genre bos? → Popular al
    |      API: /api/muzibu/songs/random?sort=popular&limit=15
    |
    +--[3] Popular da bos? → Mevcut kuyrugu karistir ve tekrar cal
    |      (Shuffle Repeat — sonsuz calma)
    |
    v
    Duplicate filtresi: kuyrukta zaten olan sarkilar eklenmez

7.3 Drag & Drop Siralama

Kuyruk icinde sarkilari surukleyerek yeniden siralama (Satir 7730-7816):

draggedIndexSuruklenen sarkinin index'i
dropTargetIndexBirakilacak pozisyon
dragStart(index)Sureklemeyi baslat
dragOver(e, index)Pozisyon guncelle
drop(dropIndex)Sarkiyi tasi — queueIndex'i ayarla
dragEnd()Temizle

8. Hata Yonetimi

8.1 HLS Hata Turleri ve Tepkiler

HataTepkiDetay
bufferStalledErrorSessizLoglama, baska islem yok
fragLoadError (401/403)URL YenilerefreshHlsUrlForCurrentSong() → yeni signed URL
fragLoadError (diger)HLS Retryhls.startLoad() ile tekrar dene
keyLoadErrorKey Cache YenileprefetchHlsKey + hls.startLoad()
internalExceptionMP3 FallbackDogrudan triggerMp3Fallback()
Fatal + recoverableRecoverhls.recoverMediaError() veya hls.swapAudioCodec()
Fatal + non-recoverableMP3 FallbackretryHlsWithNewUrl() → basarisizsa MP3

8.2 Auth Hata Yonetimi

authenticatedFetch() (Satir 1062-1146) tum API cagrilarini sarar:

8.3 Watchdog Timer v3 (Satir 3330-3470)

Her 10 saniyede bir kontrol. 3 anomali tespit eder:

  1. Ended Detection: audio.ended === true ama onTrackEnded cagirilmamis → nextTrack(true)
  2. 15sn Pause: isPlaying=true ama audio 15sn'den fazla duraklatilmis → auto-resume (play)
  3. 20sn Freeze: isPlaying=true ama currentTime 20sn degismemis → nextTrack()

_watchdogBusy flag ile race condition onlenir

8.4 Failed Songs Blacklist

addToFailedSongs(songId)Sarkiyi 5dk blacklist'e ekle
isFailedSong(songId)Sarki blacklist'te mi kontrol (suresi dolmussa cikar)
clearFailedSongs()Tum blacklist'i temizle

9. Bellek Yonetimi (Memory)

9.1 Blob URL Takibi

activeBlobUrls (Set) ile olusturulan tum blob URL'leri izlenir ve URL.revokeObjectURL() ile serbest birakilir.

createHlsBlobUrl(url)URL'yi Blob'a cevir + activeBlobUrls'e ekle
revokeBlobUrl(url)Blob URL'yi iptal et + Set'ten cikar
stopCurrentPlayback()Tum blob URL'leri revoke eder
completeCrossfade()Eski player'in blob URL'sini revoke eder
_cleanupPreloadedNext()Preload blob URL'sini revoke eder

9.2 LRU Stream Cache

addToStreamCache() (Satir 1148-1176): Max 30 entry, 5dk TTL. Stream URL'lerini bellekte tutar.

9.3 HLS Instance Yonetimi

9.4 Diger Bellek Onlemleri

10. State Yonetimi

10.1 Tum State Degiskenleri (Satir 794-940)

Auth & UI State (18 degisken)
isLoggedInbooleanGiris yapilmis mi (config'den)
currentUserobject|nullKullanici bilgileri
todayPlayedCountnumberBugun dinlenen sarki sayisi
showAuthModalnull|stringAuth modal tipi (login/register/forgot)
showQueuebooleanKuyruk paneli acik mi
showLyricsbooleanSarki sozleri paneli
showMobileMenubooleanMobil 3-nokta menu
progressPercentnumberProgress bar yuzde (0-100)
authLoadingbooleanAuth islemi devam ediyor
authErrorstringAuth hata mesaji
authSuccessstringAuth basari mesaji
isLoadingbooleanSayfa yukleniyor (SPA)
isSongLoadingbooleanSarki yukleniyor spinner
isSeekingbooleanSeek sirasinda buffer bekleniyor
contentLoadedbooleanIcerik hazir
searchQuerystringArama sorgusu
searchResultsarrayArama sonuclari
searchOpenbooleanArama paneli acik mi
Player State (18 degisken)
isPlayingbooleanCaliniyor mu
isBufferingbooleanBuffer yetersiz, bekleniyor
isTogglingbooleantogglePlayPause debounce flag
currentTimenumberSuanki pozisyon (saniye)
durationnumberSarki suresi (saniye)
animatedDurationnumberAnimasyonlu sure (counter)
volumenumberSes (0-100), localStorage'dan
isMutedbooleanSessiz mi
currentSongobject|nullSu an calan sarki
currentContextobject|nullCalma konteksti (playlist/album/genre)
currentFallbackUrlstring|nullMP3 fallback URL (signed)
queuearraySarki kuyrugu
queueIndexnumberSuanki index
isDarkModebooleanKaranlik tema (varsayilan: true)
currentPathstringSuanki URL path (SPA)
_initializedbooleanDouble-init guard
isLoggingOutbooleanCikis yapiliyor
favoritesarrayFavori sarki listesi
Audio Engine State (8 degisken)
howlHowl|nullSuanki Howler instance
hlsHls|nullSuanki HLS.js instance
isHlsStreambooleanHLS mi MP3 mi
lastFallbackReasonstring|nullMP3'e gecis nedeni (debug)
hlsCurrentLevelnumberSuanki HLS kalite (0-3, -1=auto)
hlsLevelCountnumberToplam HLS kalite sayisi
isSlowConnectionbooleanYavas baglanti uyarisi
activeHlsAudioIdstring'hlsAudio' veya 'hlsAudioNext'
Crossfade State (7 degisken) — Bolum 6'da detayli
crossfadeEnabledtrue
crossfadeDuration7000
isCrossfadingfalse
crossfadeTimeoutIdnull
crossfadeNextIndex-1
howlNextnull
hlsNextnull
Tracking State (6 degisken)
currentPlayIdnumber|nullAPI'den donen dinleme kaydi ID
playbackStartTimenumber|nullSarki baslama zamani (Date.now())
totalListenedMsnumberToplam dinlenen sure (ms)
playCountTimerIdnumber|null30sn hit timer ID
hitTrackedbooleanHit kaydedildi mi
playTrackedbooleanPlay kaydedildi mi
Preload & Buffer State (10 degisken)
_preloadedNextobject|null{songId, hls, audioId, ready, blobUrl, ...}
_preloadNextInProgressbooleanPreload devam ediyor mu
_lastNextTrackTimenumber|nullDouble-trigger guard
_nextTrackInProgressbooleanConcurrent nextTrack guard
_bufferHealthEnabledfalseBuffer monitor devre disi
_minBufferBeforePlay8Referans (kullanilmiyor)
_lowBufferThreshold3Referans (kullanilmiyor)
_resumeBufferThreshold8Referans (kullanilmiyor)
_bufferPausedByHealthfalseBuffer pause flag
_bufferCheckIntervalnullBuffer monitor interval ID
Form State (loginForm, registerForm, forgotForm, validation, phoneCountry)

Login, register, forgot password formlari + telefon ulke secimi + real-time blur validation state'leri. Satir 810-860.

10.2 Computed Properties

get currentStreamType()Satir 941-944'hls' | 'mp3' | null

Not: Sadece 1 computed property var. Geri kalan her sey fonksiyon veya duz degisken.

11. Event Sistemi

11.1 CustomEvent Dispatch (Gonderilen)

EventNe ZamanDetail
player:crossfadeStartCrossfade baslarken{fromSong, toSong, duration}
player:crossfadeCompleteCrossfade tamamlandiginda{songId}
player:stopSarki dogal olarak bittiginde-
player:songChangedYeni sarki basladiginda{song, index}
player:playCalma basladiginda{song}
player:pauseDuraklatildiginda-
player:hlsLevelChangedHLS kalite degistiginde{level, bitrate}

11.2 DOM Event Listener'lar

EventHedefAciklama
beforeunloadwindowHlsPool.destroyAll(), trackSongEndBeacon()
visibilitychangedocumentBackground playback: buffer recovery, keep-alive ping
onlinewindowKafe Mod: internet dondu → tam kurtarma dizisi
offlinewindowKafe Mod: internet gitti → _networkOffline = true
popstatewindowSPA: geri/ileri buton → loadPage()
timeupdateaudio elementCrossfade tetikleme, progress guncelleme (HLS)
endedaudio elementonTrackEnded(true) — dogal son
pauseaudio element3 katmanli auto-resume (beklenmeyen pause)

11.3 HLS.js Event Listener'lar

EventAciklama
MANIFEST_PARSEDPlaylist yuklendi → startLoad, ABR lock
FRAG_BUFFEREDIlk fragment yuk → ABR unlock
LEVEL_LOADEDSeviye yuklendi → duration fix
LEVEL_SWITCHINGKalite degisiyor → UI guncelle, isSlowConnection
ERRORHata yonetimi — Bolum 8'de detayli

11.4 Alpine.js $watch Listener'lar

IzlenenAksyon
durationanimateDurationCounter() — easeOutCubic animasyon
queuesaveQueueState() (setupAutoSave icinde)
queueIndexsaveQueueState()
currentSongsaveQueueState()
isPlayingsaveQueueState()
volumeHowl/HLS volume guncelle + localStorage kaydet

12. Bilinen Sorunlar ve Yeniden Yazim Onerileri

12.1 Kritik Yapisal Sorunlar

1. Monolitik Dosya (9.186 satir)

Tek dosyada ~120 fonksiyon. Bakim, test ve hata ayiklama cok zor. playSongFromQueue tek basina ~930 satir.

Oneri: 8-10 module bol (playback-engine, queue-manager, hls-manager, crossfade, preload, tracking, auth, ui-state)

2. Alpine.js Spread Pattern Sinirlamasi

Tum moduller ...spread ile tek objeye karistirilir. Isim cakismasi riski yuksek, encapsulation yok.

Oneri: Alpine.store() veya EventBus ile moduller arasi iletisim

3. Alpine Proxy Bypass Zorunlulugu

HLS.js instance'lari Alpine proxy'den kacinmak icin var _rawHls closure kullanmak zorunda. Bu pattern her HLS erisiminde tekrarlanir.

Oneri: HLS manager'i Alpine disinda tutarak proxy sorununu kokunden coz

4. Volume Kodu Tekrari

updateVolume() ve setVolume() neredeyse ayni kodu tekrarlar (~80 satir). Spot audio volume da ayri yonetilir.

Oneri: Tek bir volume manager olustur, tum audio kaynaklarini merkezi yonet

5. Coklu Guard/Debounce Mekanizmalari

_nextTrackInProgress, _lastNextTrackTime, isToggling, _watchdogBusy, _handlingAuthError, _lastTrackEndedTime... Ayri ayri flag'ler, merkezi bir guard sistemi yok.

Oneri: Merkezi bir state machine veya mutex pattern

12.2 Orta Oncelikli Sorunlar

6. playSongFromQueue() Karmasikligi

~930 satir, 3 ayri yol (preloaded/takeover/fresh). Her yolda benzer ama farkli duration/color/event handler setup'i var.

Oneri: Strategy pattern — her yol ayri sinif, ortak arayuz

7. playHlsStream() Boyutu

~1000 satir tek fonksiyon. HLS init, event handler'lar, hata yonetimi, Safari path — hepsi ic ice.

Oneri: HLS lifecycle manager sinifi cikart

8. Auth Logiginin Player Icinde Olmasi

Login, register, forgot password, validation — tumu player-core icinde (~500 satir). Player ile ilgisi yok.

Oneri: Auth tamamen ayri module/component'e tasi

9. SPA Router Player Icinde

navigateTo(), loadPage() fonksiyonlari player ile ilgisiz ama player icinde yasiyorlar.

Oneri: SPA router ayri module (kismi yapilmis: MuzibuSpaRouter spread)

10. Buffer Health Sistemi Devre Disi

_bufferHealthEnabled = false. ~150 satir kod hicbir zaman calismaz.

Oneri: Ya aktive et ya da kaldir (dead code)

12.3 Yeniden Yazim Icin Onerilen Modul Yapisi

player/
├── core/
│   ├── PlayerEngine.js       ← State machine (playing/paused/loading/error)
│   ├── AudioManager.js       ← HLS + Howler soyutlama katmani
│   └── VolumeController.js   ← Tek merkezi ses yonetimi
│
├── hls/
│   ├── HlsPool.js           ← Instance havuzu (mevcut, iyi)
│   ├── HlsLoader.js         ← Lazy loader + CachingKeyLoader
│   └── HlsErrorHandler.js   ← Tum HLS hata mantigi
│
├── queue/
│   ├── QueueManager.js       ← Kuyruk CRUD + auto-refill
│   ├── QueuePersistence.js   ← localStorage save/load
│   └── QueueMonitor.js       ← 10sn interval kontrolu
│
├── playback/
│   ├── PlaybackRouter.js     ← playSong/Album/Playlist/Genre/...
│   ├── PreloadManager.js     ← Next song preload + URL cache
│   └── CrossfadeEngine.js    ← Crossfade tamami
│
├── tracking/
│   ├── PlayTracker.js        ← track-start/hit/end
│   └── WatchdogTimer.js      ← v3 watchdog
│
├── network/
│   ├── AuthenticatedFetch.js ← 401/419 yonetimi
│   ├── StreamCache.js        ← LRU cache + failed songs
│   └── BackgroundPlayback.js ← visibility/online/offline
│
├── ui/
│   ├── MediaSession.js       ← Lock screen kontrolleri
│   ├── ProgressTracker.js    ← Progress bar guncelleme
│   └── PlayerColors.js       ← Gradient renk hesaplama
│
└── auth/                      ← Player DISINA tasi!
    ├── LoginHandler.js
    ├── RegisterHandler.js
    └── SessionManager.js

12.4 Iyi Calisan Mekanizmalar (Korumali!)

25 Subat 2026 • Muzibu.com.tr