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
1. api.js
100 satir SingletonAmac
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
| Fonksiyon | Imza | Aciklama |
|---|---|---|
| authenticatedFetch | (url, options) => Response|null | fetch() wrapper - 401 kontrolu yapar, force_logout/session_terminated ise MuzibuSession cagirir |
| get | (url, options) => Response|null | GET istegi - Accept:json, X-Requested-With, Referer, credentials:same-origin |
| post | (url, data, options) => Response|null | POST 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.handleSessionTerminatedcagrisi 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
2. auth.js
178 satir Eksik Impl.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
| Fonksiyon | Aciklama |
|---|---|
| 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
3. buffer-monitor.js
294 satir IIFEAmac
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
| Fonksiyon | Aciklama |
|---|---|
| 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
4. device-profiler.js
356 satir IIFEAmac
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
| Fonksiyon | Aciklama |
|---|---|
| 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
5. favorites.js
231 satir Alpine StoreAmac
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
| Fonksiyon | Aciklama |
|---|---|
| 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
6. old-device-checker.js
244 satir Cift KodAmac
Dusuk RAM (<4GB), az CPU (<4 core), eski browser (Chrome <90 vs.) tespiti. Uyari seviyeleri: warning + critical. Kalite onerisi (low/medium/high).
Fonksiyonlar
| Fonksiyon | Aciklama |
|---|---|
| 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
7. performance-debug.js
3675 satir / 194KB IIFEAmac
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!)
| Yapi | Max | Aciklama |
|---|---|---|
| activityLog[] | 100 | Son 100 aktivite (rolling buffer) |
| freezeSnapshots[] | 20 | Gecikme kayitlari (50ms+ longtask) |
| transitionLogs[] | 30 | Sarki gecis kayitlari |
| hlsErrorLogs[] | 30 | HLS hata kayitlari |
| hlsLevelSwitches[] | 50 | ABR kalite degisim gecmisi |
| memoryTimeline[] | 120 | Bellek zaman serisi (saniyede 1) |
| songPlayLog[] | 30 | Sarki format+kalite gecmisi |
| ttpLog[] | 20 | Time-to-Play olcumleri (ms) |
| rebufferLog[] | 30 | Buffer tukenme olaylari |
| navTrail[] | 30 | Sayfa gecis takibi |
| jsFaultLog[] | 20 | Global JS hata logu |
| faultMap{} | - | Sarki bazli sorun haritasi |
| visTrail[] | 20 | Sekme gorunurluk gecmisi |
| netChangeLog[] | 20 | Baglanti degisim logu |
| segStatLog[] | 50 | HLS segment yukleme istatistikleri |
| xmixDetail[] | 20 | Crossfade detaylari |
| jankLog[] | 30 | 50-100ms jank istatistikleri |
| clickTrail[] | 100 | Genel 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
8. play-helpers.js
980 satir Global FnAmac
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
| Fonksiyon | API Endpoint | Aciklama |
|---|---|---|
| playGenres(genreId) | /api/muzibu/genres/{id}/songs | Genre sarkilari + shuffle + deduplicate |
| playPlaylist(playlistId) | /api/muzibu/playlists/{id}?seed&offset&limit | Backend 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}/songs | Radyo + right sidebar preview (desktop) + shuffle + MIN 15. |
| playSector(sectorId) | /api/muzibu/sectors/{id}/songs | Sektor sarkilari + shuffle + MIN 15. |
| window.playContent(type, id, opts) | Hepsini birlestiren | Universal dispatcher. song/album/playlist/genre/sector/radio/artist. Click protection + BG tab protection. |
| window.addContentToQueue(type, id) | Ayni API'ler | Queue sonuna ekle. Duplicate cikar + index koru. |
| window.addContentToQueueNext(type, id) | Ayni API'ler | Calan 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
9. session.js
191 satir SingletonAmac
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
| Fonksiyon | Aciklama |
|---|---|
| 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
10. spa-router.js
688 satir SingletonAmac
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
| Fonksiyon | Aciklama |
|---|---|
| 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
11. speed-tester.js
395 satir IIFEAmac
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
| Fonksiyon | Aciklama |
|---|---|
| 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
12. spot-player.js
568 satir IIFE + Auto-initAmac
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
| Fonksiyon | API | Aciklama |
|---|---|---|
| init() | /api/spot/settings | localStorage'dan sayac yukle + ayarlari API'den al. Sadece isCorporate ise calisir. |
| fetchSettings() | /api/spot/settings | enabled, 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/next | Spot zamanina 1 sarki kala preload. new Audio() + canplaythrough bekle (max 3sn). |
| logPlayStart(spotId) | POST /api/spot/play-start | Dinleme kaydini baslat. play_id al. |
| logPlayEnd(wasSkipped) | POST /api/spot/play-end | Dinleme suresi + skip durumu gonder. |
| skipSpot() | - | wasSkipped=true ile logPlayEnd. |
| spotEnded() | - | wasSkipped=false ile logPlayEnd. |
| togglePause() | POST /api/spot/toggle-pause | Sube 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 |
|---|---|---|---|---|---|---|---|
| 1 | api.js | 100 | 3.5KB | Singleton + Guard | 0 | 0 | 0 |
| 2 | auth.js | 178 | 8KB | Alpine Component | 0 | 0 | 0 |
| 3 | buffer-monitor.js | 294 | 8.7KB | IIFE | 0 | 4 (per element) | 4 |
| 4 | device-profiler.js | 356 | 10.9KB | IIFE | 0 | 0 | 1 |
| 5 | favorites.js | 231 | 8.5KB | Alpine Store + Legacy | 0 | 2 | 0 (toast) |
| 6 | old-device-checker.js | 244 | 7.6KB | IIFE | 0 | 1 | 1 |
| 7 | performance-debug.js | 3675 | 194KB | IIFE + Observer | 6+ | 20+ | 0 |
| 8 | play-helpers.js | 980 | 35.8KB | Global Functions | 0 | 0 | 0 |
| 9 | session.js | 191 | 6.6KB | Singleton + Guard | 0 | 0 | 0 |
| 10 | spa-router.js | 688 | 27.7KB | Singleton + Guard | 0 | 2 | 0 |
| 11 | speed-tester.js | 395 | 12.9KB | IIFE | 0 | 0 | 1 |
| 12 | spot-player.js | 568 | 21.2KB | IIFE + Auto-init | 1 (devre disi) | 0 | 1 |
| TOPLAM | 7900 | ~346KB | - | 6+ | 29+ | 8 |
Custom Event Haritasi
| Event Adi | Kaynak | Dinleyen | Aciklama |
|---|---|---|---|
| muzibu:buffer-event | buffer-monitor | - | Buffer olayi kaydedildi |
| muzibu:media-error | buffer-monitor | - | Media element hatasi |
| muzibu:auto-speed-test-starting | buffer-monitor | - | Otomatik hiz testi basladi |
| muzibu:auto-speed-test-complete | buffer-monitor | - | Otomatik hiz testi bitti |
| muzibu:old-device-detected | device-profiler | old-device-checker | Eski cihaz tespiti (backend) |
| muzibu:device-warnings | old-device-checker | - | Cihaz uyarilari (UI icin) |
| muzibu:speed-test-complete | speed-tester | - | Hiz testi tamamlandi |
| spot-settings-updated | spot-player | - | Spot ayarlari degisti |
| Asagidakiler player-core tarafindan yayilir, performance-debug tarafindan dinlenir: | |||
| player:songChange | player-core | perf-debug | Sarki degisti |
| player:play | player-core | perf-debug | Calma basladi |
| player:pause | player-core | perf-debug | Duraklatildi |
| player:error | player-core | perf-debug | Hata |
| player:hlsError | player-core | perf-debug | HLS hatasi |
| player:crossfadeStart/End | player-core | perf-debug | Crossfade basladi/bitti |
| player:preloadStart/Success/Fail | player-core | perf-debug | Preload durumlari |
| player:fallback | player-core | perf-debug | Tam parcaya gecildi |
| player:songLoad | player-core | perf-debug | Sarki yukleme basladi (TTP) |
| player:next/prev/seek | player-core | perf-debug | Kullanici etkilesimleri |