Player Features Derinlemesine Analiz

v2 Rewrite Hazirlik Raporu - 12 Feature Dosyasi

12 Dosya ~340KB Toplam ~3675 Satir (en buyuk) IIFE + Alpine + Global Fn

Basit Anlatim (Herkes Icin)

Bu rapor, Muzibu muzik caların tum ozellik dosyalarini tek tek inceliyor. Her dosya ayri bir is yapiyor:

  • api.js - Sunucuyla konusan "postaci". Oturum duserse otomatik cikis yapar.
  • auth.js - Giris/Kayit formlari. Sifre kontrolu, telefon dogrulamasi.
  • buffer-monitor.js - Muzik takilirsa "internet yavas mi?" diye kontrol eder.
  • device-profiler.js - Cihaz parmak izi olusturur (Chrome 120, Windows, 8GB RAM gibi).
  • favorites.js - Kalp ikonuna basilinca favorilere ekler/cikarir.
  • old-device-checker.js - Eski telefon/bilgisayar kullaniyorsan uyari verir.
  • performance-debug.js - Dev bir "doktor" sistemi: takılma, bellek, hata, her seyi kayit altina alir.
  • play-helpers.js - Genre, playlist, album, radyo, sektor kartlarina basildiginda sarkilari yukler.
  • session.js - Baska cihazdan giris yapilirsa oturumu sonlandirir.
  • spa-router.js - Sayfalar arasi gecisleri sayfa yenilemeden yapar (hizli navigasyon).
  • speed-tester.js - Internet hiz testi: indirme hizi + ping olcer.
  • spot-player.js - Kurumsal hesaplar icin sarki arasi anons (reklam) sistemi.

1. api.js

100 satir Singleton
Authenticated Fetch Wrapper

Amac

Tum API cagrilarinda 401 (Unauthorized) kontrolu yapar. 401 alinirsa otomatik olarak oturumu sonlandirir ve login sayfasina yonlendirir. Sanctum stateful auth icin Referer header ekler.

Fonksiyonlar

FonksiyonImzaAciklama
authenticatedFetch(url, options) => Response|nullfetch() wrapper - 401 kontrolu yapar, force_logout/session_terminated ise MuzibuSession cagirir
get(url, options) => Response|nullGET istegi - Accept:json, X-Requested-With, Referer, credentials:same-origin
post(url, data, options) => Response|nullPOST istegi - CSRF token + Content-Type:json + Referer + credentials

State

Yok - Stateless utility objesi.

Event'ler

Dinler: Yok. Yayar: Yok (MuzibuSession.handleSessionTerminated cagirir).

Bagimliliklar

session.js (MuzibuSession.handleSessionTerminated). CSRF token icin meta[name="csrf-token"]. window.MuzibuApi olarak export edilir.

Timer/Interval

Yok.

Potansiyel Sorunlar

  • this context authenticatedFetch icinde this.handleSessionTerminated cagrisi var ama MuzibuApi'nin kendisinde bu metod yok. Cagiran context player-core olmali.
  • Cift guard typeof MuzibuApi kontrolu ile SPA re-execution onlenir, dogru pattern.
  • Kullanilmiyor? player-core'da direkt fetch() kullaniliyor olabilir - kontrol edilmeli.

2. auth.js

178 satir Eksik Impl.
Login/Register/Validation

Amac

Kullanici giris, kayit ve sifre sifirlama formlari icin Alpine.js component. Form validasyonu (isim, email, telefon, sifre) yapar. Ulke kodu secimi destekler (17 ulke).

Fonksiyonlar

FonksiyonAciklama
validateName()Isim: min 3 karakter, sadece harf + Turkce karakter
validateEmail()Basit email regex kontrolu
validatePhone()Turkiye formati: 5XX XXX XX XX (10 hane)
validatePassword()Min 8 karakter, buyuk+kucuk+rakam zorunlu
validatePasswordConfirmation()Sifre tekrari eslesiyor mu
handleLogin()BOS - Implementasyon yok!
handleRegister()BOS - Implementasyon yok!
handleLogout()BOS - Implementasyon yok!

State

showAuthModal, authLoading, authError, authSuccess, showPassword, showLoginPassword, loginForm (email/password/remember), registerForm (name/email/phone/password/password_confirmation), forgotForm (email), validation (5 alan), phoneCountry, phoneCountries (17 ulke).

Bagimliliklar

safeStorage (core/safe-storage.js) - remembered_email icin. Alpine.js (component olarak). window.muzibuAuth olarak export.

Potansiyel Sorunlar

  • Eksik handleLogin, handleRegister, handleLogout fonksiyonlari BOS. "Implementation from original muzibu-player.js" yorumuyla birakilmis. Bu dosya aktif kullaniliyor mu belirsiz.
  • Telefon Sadece Turkiye formatini zorunlu kiliyor (5 ile basla). Diger ulke kodlari secili olsa bile ayni validasyon.
  • Guard yok Redeclaration guard yok, SPA navigation'da tekrar yuklenebilir.

3. buffer-monitor.js

294 satir IIFE
Buffer/Donma Izleme

Amac

Audio/video elementlerindeki buffer (donma) olaylarini izler. 1 dk icinde 1+ takilma olursa otomatik hiz testi tetikler. 30dk cooldown ile session basina max 2 test.

Fonksiyonlar

FonksiyonAciklama
init(options)Monitor'u baslatir. autoTestEnabled ayarlanabilir.
monitor(mediaElement)Audio/Video elementi izlemeye alir. waiting/playing/stalled/error event'leri dinler.
recordBufferEvent(duration)Buffer olayi kaydeder, otomatik test kontrolu yapar.
checkAutoTest()Esik kontrolu + cooldown kontrolu + test tetikleme.
triggerSpeedTest()MuzibuSpeedTester.runTest() cagirir. async.
getStats()Session buffer sayisi, son test zamani, config doner.
setEnabled(bool)Monitor'u ac/kapat.
configure(options)CONFIG ayarlarini guncelle.
resetSessionCount()Sayaclari sifirla.
runFirstVisitTest()DEVRE DISI. Ilk ziyaret testi.

State

bufferEvents[] (rolling window), lastTestTime, monitoredElements (WeakSet), isEnabled, sessionBufferCount.

CONFIG: BUFFER_THRESHOLD=1, BUFFER_WINDOW_MS=60000, COOLDOWN_MS=1800000, MIN_BUFFER_DURATION_MS=500, AUTO_TEST_ENABLED=true.

Event'ler

Yayar: muzibu:buffer-event, muzibu:media-error, muzibu:auto-speed-test-starting, muzibu:auto-speed-test-complete.

Dinler: Media element waiting/playing/stalled/error (per element).

Bagimliliklar

MuzibuSpeedTester (speed-tester.js). pLog/pWarn (global debug fonksiyonlari).

Timer/Interval

Yok. Event-driven calisir.

Potansiyel Sorunlar

  • WeakSet monitoredElements icin WeakSet kullanilmis - iyi pratik, GC'ye engel olmaz.
  • Devre disi ozellikler runFirstVisitTest() ve setupConnectionChangeTest() devre disi. Gereksiz kod.
  • Tek threshold Sadece 1 buffer olayi yeterli test tetiklemek icin. Hassas ama false positive riski.

4. device-profiler.js

356 satir IIFE
Cihaz Parmak Izi

Amac

Cihaz bilgilerini toplar (browser, OS, RAM, CPU, ekran, touch, mobile), fingerprint olusturur ve backend'e POST eder. localStorage'da cache'ler. Eski cihaz tespiti yaparsa event yayar.

Fonksiyonlar

FonksiyonAciklama
init()Profil olustur/guncelle. localStorage cache kontrolu. Backend'e POST /api/muzibu/device-profile.
collectDeviceInfo()UAParser.js + fallback ile browser/OS/RAM/CPU/screen/touch/mobile bilgisi toplar.
generateFingerprint(info)Basit btoa() hash, 32 karakter. Server-side SHA-256 yapilacak.
getProfileId()Sync getter - memory veya localStorage'dan ID.
getDeviceInfo()collectDeviceInfo() wrapper.
clearCache()localStorage + memory temizle.
detectBrowser/Version/Platform (+ Fallback)UAParser varsa onu kullan, yoksa regex fallback. 8 ayri fonksiyon.

State

deviceProfileId, currentFingerprint, isInitialized, uaParserResult (lazy cache).

localStorage: muzibu_device_profile_id, muzibu_device_fingerprint.

Event'ler

Yayar: muzibu:old-device-detected (backend response'dan).

Bagimliliklar

UAParser.js (opsiyonel, fallback var). Backend API: /api/muzibu/device-profile.

Potansiyel Sorunlar

  • Iyi Backend basarisiz olsa bile player calismaya devam eder (graceful degradation).
  • Cift kod detectBrowser/Version/Platform fonksiyonlari old-device-checker.js'de de var. Ayni is iki kere.
  • Fingerprint zayif btoa() basit, ama server-side SHA-256 ile guclendirilecek.

5. favorites.js

231 satir Alpine Store
Favori Yonetimi

Amac

Song, album, playlist, radio, artist, genre, sector icin favori ekle/cikar. Optimistic UI update + rollback. 401'de pending favorite kaydedip login'e yonlendir. 7 model class destegi.

Fonksiyonlar

FonksiyonAciklama
toggle(type, id)API: POST /api/favorites/toggle. Optimistic update. 401 handling. SPA cache clear.
isFavorite(type, id)favorites array'de "type-id" var mi?
isLiked(songId)Alias: isFavorite('song', songId)
toggleLike(songId)Alias: toggle('song', songId)
toggleFavorite(type, id)Alias: toggle(type, id) - backward compat
getModelClass(type)type string'den full PHP model class dondurur.
loadFavorites()GET /api/favorites/list ile sunucudan tum favorileri yukle.

State

Alpine.store('favorites'): favorites[] (string array: "song-123"), loading (boolean).

Event'ler

Dinler: alpine:init (store olusturma), alpine:initialized (auto-load).

Yayar: Toast gosterir (Alpine.store('toast').show).

Bagimliliklar

Alpine.js, MuzibuSpaRouter.clearDynamicCache(), window.savePendingFavorite, muzibuPlayerConfig.isLoggedIn, frontLang.

Potansiyel Sorunlar

  • Legacy kod muzibuFavorites() fonksiyonu (satir 192-220) legacy fallback. Alpine store ile ayni is. Gereksiz duplikasyon.
  • Iyi Optimistic update + rollback pattern dogru uygulanmis.
  • Iyi 401'de pending favorite kaydedip login sonrasi geri donme destegi.

6. old-device-checker.js

244 satir Cift Kod
Eski Cihaz Uyarisi

Amac

Dusuk RAM (<4GB), az CPU (<4 core), eski browser (Chrome <90 vs.) tespiti. Uyari seviyeleri: warning + critical. Kalite onerisi (low/medium/high).

Fonksiyonlar

FonksiyonAciklama
init()checkDevice() calistir + muzibu:old-device-detected event'ini dinle.
checkDevice()RAM/CPU/Browser kontrol, deviceWarnings[] doldur.
isOldDevice()Kritik uyari var mi?
isSufficientForStreaming()Kritik RAM/CPU sorunu yoksa true.
getRecommendedQuality()'low'/'medium'/'high' doner.
showWarnings()muzibu:device-warnings event'i yayar. warningsShown flag ile bir kez gosterir.
detectBrowser/Version()UA string parsing (ayni kod device-profiler.js'de de var!)

Event'ler

Dinler: muzibu:old-device-detected (DeviceProfiler'dan gelen backend uyarilari).

Yayar: muzibu:device-warnings (UI'da gosterilmek uzere).

Potansiyel Sorunlar

  • Cift Kod detectBrowser() ve detectBrowserVersion() device-profiler.js'deki ile birebir ayni. v2'de birlestirmeli.
  • Device profiler overlap Hem bu dosya hem device-profiler eski cihaz kontrolu yapiyor. Sorumluluklar net ayrilmali.
  • Bir kez goster warningsShown flag sayesinde uyari tekrar gosterilmiyor.

7. performance-debug.js

3675 satir / 194KB IIFE
Debug & Monitoring Sistemi

Amac

v4 debug sistemi. Bellek, CPU, HLS, crossfade, sarkı gecisleri, donmalar, buffer, JS hatalari, DOM tiklama, sayfa gecisleri, sekme gorunurlugu, baglanti degisimi, ortam guvenligi... HER SEYI izler ve raporlar. ?debug=1 URL parametresi ile acilir. Overlay panel + minimized badge modlari var.

Veri Yapilari (20+ adet!)

YapiMaxAciklama
activityLog[]100Son 100 aktivite (rolling buffer)
freezeSnapshots[]20Gecikme kayitlari (50ms+ longtask)
transitionLogs[]30Sarki gecis kayitlari
hlsErrorLogs[]30HLS hata kayitlari
hlsLevelSwitches[]50ABR kalite degisim gecmisi
memoryTimeline[]120Bellek zaman serisi (saniyede 1)
songPlayLog[]30Sarki format+kalite gecmisi
ttpLog[]20Time-to-Play olcumleri (ms)
rebufferLog[]30Buffer tukenme olaylari
navTrail[]30Sayfa gecis takibi
jsFaultLog[]20Global JS hata logu
faultMap{}-Sarki bazli sorun haritasi
visTrail[]20Sekme gorunurluk gecmisi
netChangeLog[]20Baglanti degisim logu
segStatLog[]50HLS segment yukleme istatistikleri
xmixDetail[]20Crossfade detaylari
jankLog[]3050-100ms jank istatistikleri
clickTrail[]100Genel DOM tiklama takibi
envCheck{}-Ortam & guvenlik kontrolu
usrAct{}-Kullanici etkilesim sayaclari

Event'ler Dinler

player:songChange, player:play, player:pause, player:error, player:hlsError, player:crossfadeStart, player:crossfadeEnd, player:preloadStart, player:preloadSuccess, player:preloadFail, player:fallback, player:songLoad, player:next, player:prev, player:seek, player:autoplay, player:shuffleNext, livewire:navigate, livewire:navigated, popstate, visibilitychange, navigator.connection.change, window.error, window.unhandledrejection, click (global capture), audio:waiting, audio:playing

Timer/Interval

  • activityLogInterval - setInterval 1000ms: bellek, audio element, sarki degisimi, stale audio, GC tespiti, uyari
  • updateInterval - setInterval 1000ms: panel guncelleme (gorunurse)
  • hlsListenerInterval - setInterval 2000ms: HLS level listener baglama deneme (max 30)
  • attachSegmentStatListener - setInterval 5000ms: segment stat listener baglama
  • autoLogInterval - setInterval 3600000ms (60dk): otomatik log gonderimi
  • expireCheckInterval - setInterval 30000ms: debug suresi doldu mu kontrolu
  • PerformanceObserver - longtask izleme (50ms+)
  • MutationObserver - yeni audio element eklenmesini izle

Potansiyel Sorunlar

  • Dev boyut 3675 satir / 194KB tek dosyada. Production'da da yukleniyor (minify yok). v2'de lazy-load + code-split sart.
  • console.error override console.error intercept ediliyor (satir 1119). Diger kutuphanelerin hata ciktisini etkileyebilir.
  • playSongFromQueue monkey-patch Alpine store'un playSongFromQueue fonksiyonu wrap ediliyor (satir 1587). Race condition riski.
  • 6 ayri interval En az 6 setInterval ayni anda calisiyor. Hafif cihazlarda performans etkisi.
  • Global click listener Her DOM tiklamasini capture phase'de yakalayip loglama (satir 1541). Performans maliyeti.
  • WebRTC STUN checkWebRTC() Google STUN sunucusuna baglaniyor. GDPR/privacy endisesi.
  • Iyi Root cause analiz sistemi (analyzeFreezeRootCause) detayli ve faydali.
  • Iyi Backend'e log gonderme + clipboard kopyalama + ortam kontrolu.

8. play-helpers.js

980 satir Global Fn
Content Play & Queue

Amac

Genre, playlist, album, radio, sector, artist, song kartlarina basildiginda API'den sarkilari ceker, queue'ya yukler ve calmaya baslar. Universal playContent + addContentToQueue + addContentToQueueNext fonksiyonlari.

Fonksiyonlar

FonksiyonAPI EndpointAciklama
playGenres(genreId)/api/muzibu/genres/{id}/songsGenre sarkilari + shuffle + deduplicate
playPlaylist(playlistId)/api/muzibu/playlists/{id}?seed&offset&limitBackend shuffle (seed). Refill icin offset/seed/hasMore takibi.
playAlbum(albumId)/api/muzibu/albums/{id}Album sarkilari + shuffle + deduplicate + MIN 15 sarki dolumu (genre'den).
playRadio(radioId)/api/muzibu/radios/{id}/songsRadyo + right sidebar preview (desktop) + shuffle + MIN 15.
playSector(sectorId)/api/muzibu/sectors/{id}/songsSektor sarkilari + shuffle + MIN 15.
window.playContent(type, id, opts)Hepsini birlestirenUniversal dispatcher. song/album/playlist/genre/sector/radio/artist. Click protection + BG tab protection.
window.addContentToQueue(type, id)Ayni API'lerQueue sonuna ekle. Duplicate cikar + index koru.
window.addContentToQueueNext(type, id)Ayni API'lerCalan sarkinin hemen ardina ekle (Play Next).
shuffleArray(array)-Fisher-Yates shuffle.

State

playDebounce (lastCall map, 1sn delay). PLAY_HELPERS_DEBUG flag.

Bagimliliklar

Alpine.store('player'), Alpine.store('muzibu') (.setPlayContext), Alpine.store('sidebar') (.showRadioPreview), MuzibuSpaRouter.isClickProtected(), window.muzibuLang, window.trans().

Potansiyel Sorunlar

  • Tekrarlayan kod playAlbum, playRadio, playSector icinde MIN 15 sarki dolumu + genre fetch + shuffle + deduplicate blogu 3 KERE kopyalanmis. 100+ satir duplikasyon.
  • addContentToQueue / addContentToQueueNext iki fonksiyon icindeki switch/case API fetch kodlari da BIREBIR AYNI. 150+ satir duplikasyon.
  • Premium check Her fonksiyonda ayri premium + login kontrolu. DRY ihlali.
  • No loading state Kart tiklandiginda yuklenme gostergesi yok (sadece debounce var).
  • Iyi playContent click protection + bg tab protection.
  • Iyi Playlist: backend seed ile deterministik shuffle + refill icin context kaydi.

9. session.js

191 satir Singleton
Session Sonlandirma

Amac

Baska cihazdan giris yapildiginda oturumu sonlandirir. Playback durdurur, storage temizler, API logout yapar, hard redirect ile login'e gonderir. Modal gosterme destegi (kullanilmiyor, direkt redirect).

Fonksiyonlar

FonksiyonAciklama
handleSessionTerminated(msg)Ana handler: stop playback + clear state + API logout + hard redirect /login?session_terminated=1
showSessionTerminatedModal(msg)Orange tema modal gosterir. Tamam butonuna basinca performFullLogout.
performFullLogout()clearAllBrowserStorage + clearCacheAPI + form POST /logout ile tam cikis.
clearAllCookies()Tum cookie'leri sil (domain + subdomain).
clearCacheAPI()Cache API'deki tum cache'leri sil.
clearAllBrowserStorage()localStorage: player_state, queue, favorites, play_context, volume sil. sessionStorage clear.
forceLogout()State reset + page reload.

State

_sessionTerminatedHandling (sonsuz dongu onleme flag).

Potansiyel Sorunlar

  • this context handleSessionTerminated icinde this.stopCurrentPlayback(), this.isPlaying gibi cagrilar var. Bu "this" player-core context olmali. .call(playerStore) ile cagrilmali.
  • Modal kullanilmiyor handleSessionTerminated direkt redirect yapiyor. showSessionTerminatedModal var ama cagrilmiyor. Olu kod.
  • Iyi _sessionTerminatedHandling ile sonsuz dongu onleme.
  • Iyi Form POST ile logout (Sanctum CSRF uyumlu).

10. spa-router.js

688 satir Singleton
SPA Navigation + Prefetch

Amac

Sayfa icerigi AJAX ile yukler, <main> icini degistirir, player'i bozmadan sayfa degistirir. Auth sayfalari bypass eder (full reload). Prefetch cache (30dk, max 50 sayfa). Dynamic page'ler ASLA cache'lenmez. Cloudflare email decode. Right sidebar yonetimi.

Fonksiyonlar

FonksiyonAciklama
initSpaNavigation()Singleton init. popstate + click intercept. Viewport/hover prefetch DEVRE DISI.
navigateTo(url)URL normalize et + history.pushState + loadPage.
loadPage(url, addToHistory)Cache kontrol + fetch + DOMParser + main replace + Alpine destroy/init + sidebar + scroll top + title guncelle + Cloudflare email decode.
fetchPage(url)X-Requested-With: XMLHttpRequest + Accept: text/html.
prefetch(url, source)Onbellege al (LRU eviction). DEVRE DISI ama kod duruyor.
isAuthPath(path)login/register/forgot-password/reset-password/verify-email/logout
isDynamicPath(path)favorites/my-playlists/dashboard/listening-history/corporate vb.
clearDynamicCache()Favori toggle sonrasi dynamic sayfalarinin cache'ini temizle.
isClickProtected()Son navigasyondan sonra 200ms icinde mi? Yanlislikla tiklamayi onle.
decodeCloudflareEmails()SPA navigasyon sonrasi CF email obfuscation'i coz.
cfDecodeEmail(str)CloudFlare XOR decode algoritmasi.

State

prefetchCache (Map, max 50), prefetchQueue (Set), cacheTimeout (30dk), maxCacheSize (50), observer (IntersectionObserver - DEVRE DISI), lastNavigationTime, clickProtectionMs (200ms), isInitialized, currentPath.

Event'ler

Dinler: popstate, document click (delegated). Yayar: Dolayili - Alpine sidebar store guncellemesi.

Potansiyel Sorunlar

  • this context karistirmasi loadPage icinde this.isLoading, this.showToast gibi cagrilar var. Bunlar player store'un context'inde calistirilmali (.call ile). Karisik sorumluluk.
  • Devre disi kod Viewport prefetch, hover prefetch fonksiyonlari var ama hepsi devre disi. ~100 satir olu kod.
  • Alpine destroy/init destroyTree + initTree her navigasyonda cagriliyor. Yogun DOM islemi. Memory leak riski Alpine component'ler dogru temizlenmezse.
  • 10sn timeout Sayfa yukleme timeout'u 10sn, sonra full page reload. Yavas baglantilarda flicker.
  • Iyi www-tolerant origin check (www.domain.com == domain.com).
  • Iyi Script tag'leri cikarma (XSS + cift calisma onleme).
  • Iyi data-spa="false" attribute bypass destegi.

11. speed-tester.js

395 satir IIFE
Internet Hiz Testi

Amac

Download hizi (Mbps) + latency (ping) + jitter olcer. Manuel (100MB dosya) ve otomatik (1MB dosya) test modlari. Network Information API entegrasyonu. Backend'e sonuc gonderir. Kalite onerisi uretir.

Fonksiyonlar

FonksiyonAciklama
runTest(trigger, bufferCount)Tam test: download + latency paralel. Backend'e POST /api/muzibu/speed-test.
measureDownloadSpeed(isManual)Manuel: 100MB, Otomatik: 1MB. cache:no-store. Blob olarak indir.
measureLatency()5 ping /ping.php, trim outliers, ortalama + jitter hesapla.
analyzeResult(result)is_slow, is_sufficient, quality_recommendation (low/medium/high), issues[].
quickCheck()Network API'den hizli bilgi (test yapmadan).
isSufficientForStreaming()Test sonucu veya Network API'den streaming yeterliligi.
watchConnectionChanges(cb)navigator.connection 'change' event listener.
getConnectionInfo()Network Info API: type, effective_type, downlink, rtt, save_data.
estimateConnectionType(Mbps)Hiz bazli tahmin: fiber/broadband/dsl/slow-dsl/very-slow.

State

lastTestResult, isTestRunning. THRESHOLDS: MIN_STREAMING=2Mbps, GOOD_SPEED=10Mbps, MAX_LATENCY=300ms, GOOD_LATENCY=100ms.

Event'ler

Yayar: muzibu:speed-test-complete.

Potansiyel Sorunlar

  • 100MB dosya Manuel test 100MB indiriyor. Mobil kullanicilarin veri paketi icin problem.
  • Blob memory response.blob() ile tum dosya belleğe alinir. 100MB = 100MB RAM kullanimi.
  • Iyi isTestRunning guard ile cift test onleme.
  • Iyi Latency: 5 olcum, trim outliers, jitter hesabi.

12. spot-player.js

568 satir IIFE + Auto-init
Kurumsal Anons Sistemi

Amac

Kurumsal hesaplar icin X sarkida bir anons (spot) calar. 30sn+ dinleme sayilir. Preload destegi (gapless gecis). Client-side rotation. Polling (DEVRE DISI). Skip + play-end loglama.

Fonksiyonlar

FonksiyonAPIAciklama
init()/api/spot/settingslocalStorage'dan sayac yukle + ayarlari API'den al. Sadece isCorporate ise calisir.
fetchSettings()/api/spot/settingsenabled, songsBetween, corporateId, branchId, version, spots[] al.
onSongListened(duration)-30sn+ ise sayaci artir. songsBetween'e ulasildi mi kontrol et.
playNextSpot()/api/spot/next (fallback)Preloaded varsa kullan, yoksa client-side rotation. logPlayStart() cagir.
preloadSpot()/api/spot/nextSpot zamanina 1 sarki kala preload. new Audio() + canplaythrough bekle (max 3sn).
logPlayStart(spotId)POST /api/spot/play-startDinleme kaydini baslat. play_id al.
logPlayEnd(wasSkipped)POST /api/spot/play-endDinleme suresi + skip durumu gonder.
skipSpot()-wasSkipped=true ile logPlayEnd.
spotEnded()-wasSkipped=false ile logPlayEnd.
togglePause()POST /api/spot/toggle-pauseSube icin spot durdur/devam ettir.
handleVersionChange(v, spots)-Version degisince preload iptal + event dispatch.

State

enabled, isPaused, songsBetween, songsPlayed, corporateId, branchId, currentSpot, currentPlayId, isPlaying, spotStartTime, wasSkipped, preloadedSpot, preloadedAudio, isPreloading, spotSettingsVersion, activeSpots[], pollingInterval.

localStorage: muzibu_spot_counter, muzibu_spot_counter_settings.

Event'ler

Yayar: spot-settings-updated (Alpine UI guncelleme icin).

Timer/Interval

pollingInterval = setInterval 300000ms (5dk) - DEVRE DISI (gereksiz trafik). Preload: setTimeout 3000ms (max bekleme).

Potansiyel Sorunlar

  • Iyi Sadece corporate kullanicilar icin auto-init (non-corporate skip).
  • Iyi Preload + gapless gecis destegi.
  • Devre disi polling Polling kodu var ama devre disi. Olu kod.
  • logPlayStart await yok logPlayStart fire-and-forget, spot hemen calsin diye await kaldirilmis. API hatasi sessiz gecilir.
  • Version tracking spotSettingsVersion ile settings degisikligini yakalayabiliyor.

Genel Degerlendirme - v2 Icin Oncelikler

Kritik Sorunlar (Hemen Cozulmeli)

1. performance-debug.js = 194KB (3675 satir)

Production'da bile yukleniyor. Debug amacli bir dosya 194KB olmamali. Lazy-load + code-split + conditional loading sart.

2. play-helpers.js icindeki dev duplikasyon

MIN 15 sarki dolumu (3 kez), addContentToQueue switch/case (2 kez), premium check (6 kez). ~300+ satir tekrar kod. Ortak fonksiyonlar cikarilmali.

3. this context karistirmasi (session.js, spa-router.js, api.js)

Bu dosyalar player-core'un "this" context'inde calistirilmak uzere yazilmis. .call() bagimliligi fragile. v2'de dependency injection veya explicit store reference kullanilmali.

4. auth.js icindeki bos fonksiyonlar

handleLogin, handleRegister, handleLogout bos. Ya tamamlanmali ya da dosya kaldirilmali.

Orta Oncelik (v2'de Duzeltilmeli)

5. Browser/OS tespit kodu duplikasyonu

device-profiler.js + old-device-checker.js + performance-debug.js'de ayni regex'ler 3 kere. Tek bir utility modulu olusturulmali.

6. Devre disi birakılmis ozellikler (olu kod)

buffer-monitor: firstVisitTest+connectionTest. spa-router: viewport+hover prefetch. spot-player: polling. Toplam ~200 satir olu kod temizlenmeli.

7. Legacy kod (favorites.js)

muzibuFavorites() eski fonksiyon Alpine store varken gereksiz. window.muzibuFavorites export'u kaldirilabilir.

8. 100MB hiz testi dosyasi

Mobil kullanicilar icin 100MB download problem. Range request ile 1-2MB yeterli olabilir.

Mimari Oneriler (v2 Rewrite)

A. Modul Sistemi

Su an: IIFE + window global + typeof guard. v2: ES modules (import/export) + bundler. Her feature bagimsiz import edilebilir olmali.

B. Event Bus

Su an: window.dispatchEvent(new CustomEvent(...)). v2: Merkezi event bus. Typed events. Subscriber cleanup.

C. Shared Utilities

Browser detect, UA parse, fetch wrapper, debounce, shuffle, premium check, CSRF token - tek bir utils modulu.

D. Debug Conditional Loading

performance-debug.js SADECE ?debug=1 oldugunda yuklensin. 194KB'lik dosya her kullaniciya gonderilmemeli.

Dosya Istatistikleri

# Dosya Satir Boyut Pattern Interval Event Dinler Event Yayar
1api.js1003.5KBSingleton + Guard000
2auth.js1788KBAlpine Component000
3buffer-monitor.js2948.7KBIIFE04 (per element)4
4device-profiler.js35610.9KBIIFE001
5favorites.js2318.5KBAlpine Store + Legacy020 (toast)
6old-device-checker.js2447.6KBIIFE011
7performance-debug.js3675194KBIIFE + Observer6+20+0
8play-helpers.js98035.8KBGlobal Functions000
9session.js1916.6KBSingleton + Guard000
10spa-router.js68827.7KBSingleton + Guard020
11speed-tester.js39512.9KBIIFE001
12spot-player.js56821.2KBIIFE + Auto-init1 (devre disi)01
TOPLAM7900~346KB-6+29+8

Custom Event Haritasi

Event AdiKaynakDinleyenAciklama
muzibu:buffer-eventbuffer-monitor-Buffer olayi kaydedildi
muzibu:media-errorbuffer-monitor-Media element hatasi
muzibu:auto-speed-test-startingbuffer-monitor-Otomatik hiz testi basladi
muzibu:auto-speed-test-completebuffer-monitor-Otomatik hiz testi bitti
muzibu:old-device-detecteddevice-profilerold-device-checkerEski cihaz tespiti (backend)
muzibu:device-warningsold-device-checker-Cihaz uyarilari (UI icin)
muzibu:speed-test-completespeed-tester-Hiz testi tamamlandi
spot-settings-updatedspot-player-Spot ayarlari degisti
Asagidakiler player-core tarafindan yayilir, performance-debug tarafindan dinlenir:
player:songChangeplayer-coreperf-debugSarki degisti
player:playplayer-coreperf-debugCalma basladi
player:pauseplayer-coreperf-debugDuraklatildi
player:errorplayer-coreperf-debugHata
player:hlsErrorplayer-coreperf-debugHLS hatasi
player:crossfadeStart/Endplayer-coreperf-debugCrossfade basladi/bitti
player:preloadStart/Success/Failplayer-coreperf-debugPreload durumlari
player:fallbackplayer-coreperf-debugTam parcaya gecildi
player:songLoadplayer-coreperf-debugSarki yukleme basladi (TTP)
player:next/prev/seekplayer-coreperf-debugKullanici etkilesimleri