v4 — Güncel Akış

Soft Mode & Audio Karar Sistemi

Muzibu Ses Platformu — Tüm Akış, Tüm Parametreler

23 Şubat 2026 — 13 Bölüm

v4 YENİLİKLER Zayıf mobil → MP3 128k | hls_soft_mobile kaldırıldı | 3 player hatası düzeltildi

İçindekiler

1. Basit Anlatım (Herkes İçin)

Muzibu'da müzik iki farklı yöntemle gönderilebilir:

BÜTÜN (MP3)

Şarkı tek seferde, komple indirilir. Tıpkı bir fotoğraf indirmek gibi — ya gelir ya gelmez.

Kalite: 64 kbps, 128 kbps veya orijinal

PARÇALI (HLS)

Şarkı küçük parçalara bölünerek gönderilir. Netflix gibi — internet hızına göre kaliteyi otomatik ayarlar.

4 seviye: 32, 64, 128 kbps + orijinal

SOFT (HLS Lite)

HLS'nin hafifletilmiş hali. Yüksek kalite seçenekleri kaldırılır, sadece düşük kaliteler kalır.

Varsayılan: ultralow + low + mid

Soft Mode neden var? İnternet bağlantısı zayıf olan ortamlarda (kafeler, metrolar, kırsal bölgeler) yüksek kaliteye geçiş yapılmasını engellemek için. Böylece şarkı hiç takılmaz — ama yine de iki seviye arasında otomatik geçiş yapar (sabit MP3'ten üstün).

Kurumsal hesap ne zaman MP3'e geçer? Bir şirketin Muzibu hesabında 50'den fazla kullanıcı varsa, sunucu yükünü azaltmak için tüm kullanıcılar otomatik olarak MP3 formatına geçer. Bu eşik ENV'den ayarlanabilir.

v4 DEĞİŞİKLİK

Zayıf telefonlar artık MP3 128kbps alıyor. Daha önce v3'te Soft HLS planlanmıştı, ancak zayıf cihazlarda HLS decoder işlemciye yük bindirdiğinden MP3'e geri dönüldü. MP3 tek dosya olduğundan işlemci kullanmaz, batarya tüketmez.

2. Tüm Format Seçenekleri — Detaylı Tablo

Seçenek Gönderim Soft? ABR? Şifreli? Açıklama
auto Değişken Cihaz + internet'e göre otomatik karar
mp3_64 Bütün Hayır Hayır Hayır Sabit 64 kbps MP3. En düşük kalite, en az veri.
mp3_128 Bütün Hayır Hayır Hayır Sabit 128 kbps MP3. Orta kalite. MOBİL VARSAYILAN
mp3_auto Bütün Hayır Hayır Hayır Cihaz güçlüyse 128k, zayıfsa 64k MP3.
hls_soft Parçalı EVET Evet AES-128 Soft Mode! master.m3u8'den high kaldırılır. ENV'de ayarlanabilir.
hls_32 Parçalı Hayır Kilitli AES-128 Sadece ultralow (32k). Level lock, ABR yok.
hls_64 Parçalı Hayır Kilitli AES-128 Sadece low (64k). Level lock, ABR yok.
hls_128 Parçalı Hayır Kilitli AES-128 Sadece mid (128k). Level lock, ABR yok.
hls_auto Parçalı Hayır 4 seviye AES-128 Tüm seviyeler açık, ABR serbest. En güçlü mod.
KALDIRILDI hls_soft_mobile

v3'te eklenmişti (zayıf mobil otomatik soft HLS). v4'te kaldırıldı — zayıf mobiller artık MP3 128kbps alıyor. Kodda hiçbir referansı kalmadı.

3. Normal HLS vs Soft HLS — Ne Değişiyor?

Normal HLS (hls_auto)

high orijinal kalite ~256 kbps
mid 128 kbps
low 64 kbps
ultralow 32 kbps

4 seviye arası otomatik geçiş (ABR)

Soft HLS (hls_soft) — Varsayılan ENV

high kaldırıldı
mid 128 kbps aktif
low 64 kbps aktif
ultralow 32 kbps aktif

3 seviye: ultralow + low + mid (max 128 kbps)

ENV: MUZIBU_SOFT_PLAYER_VARIANTS=ultralow,low,mid

Dikkat: Soft modda hangi varyantların kalacağı MUZIBU_SOFT_PLAYER_VARIANTS ile belirlenir. Varsayılan ultralow,low,mid. Sadece ultralow,low yazarsan mid de kaldırılır.

4. Audio Format Karar Zinciri — Güncel Akış v4 GÜNCEL

Dosya: SongStreamController.php → resolveAudioFormat() — Her stream isteğinde bu zincir çalışır:

Adım -1: Acil Override (Kill Switch)
MUZIBU_AUDIO_FORCE doluysa → herkesi (admin dahil) zorla bu formata geçir
$forceFormat = config('muzibu.audio.force_format');
if ($forceFormat) → mp3_* = 'mp3', hls_* = 'hls' // Zincir BURADA biter
Adım 0: Root Test Override (?_mz=...)
URL'de ?_mz=hsoft veya ?_mz=s6 gibi parametre varsa ve kullanıcı root ise → test formatını kullan
Adım 1: Admin Kullanıcı Tercihi (audio_preference)
Admin panelden kullanıcıya atanan tercih. auto değilse → o tercihi kullan
Değerler: mp3_64, mp3_128, mp3_auto, hls_32, hls_64, hls_128, hls_auto, hls_soft
Adım 2: Kurumsal Hesap Kontrolü
Kullanıcının corporate_account_id varsa ve o hesapta 50'den fazla kullanıcı varsa → otomatik MP3
$corpThreshold = config('muzibu.audio.corporate_mp3_threshold', 50);
$corpAccountId = $user->corporate_account_id;
if ($corpAccountId && DB::table('users')
    ->where('corporate_account_id', $corpAccountId)->count() > $corpThreshold)
    → return 'mp3'; // Sunucu yükü koruması

Neden? 50+ kişilik kurumsal hesapta herkes HLS dinlerse sunucu segment istekleriyle dolar. MP3 tek dosya olduğundan sunucu yükü çok daha az.

Eşik: MUZIBU_CORPORATE_MP3_THRESHOLD=50 (ENV'den ayarlanabilir)

Adım 3: Mobil/Tablet Tespiti
v4 GÜNCELLEME
jenssegers/agent ile User-Agent parse. Mobil veya tablet ise:
$deviceCap = request()->cookie('mz_device');

if ($deviceCap === 'good')
    → return 'hls'; // Güçlü telefon → TAM kalite HLS
else
    → return 'mp3'; // Zayıf telefon VEYA cookie yok → MP3 128k
Cihaz mz_device Sonuç Açıklama
Mobil good HLS TAM RAM≥4GB + CPU≥4 + 4G → kaliteli müzik
Mobil weak MP3 128k Zayıf telefon → MP3 128kbps (batarya dostu, CPU yükü yok)
Mobil yok MP3 128k Cookie yok (ilk ziyaret, süresi dolmuş, JS kapalı) → güvenli MP3
Tablet good HLS TAM Güçlü tablet → tam HLS
Tablet weak MP3 128k Zayıf tablet → MP3 128kbps

v4 değişiklik: v3'te zayıf mobil → Soft HLS olarak değiştirilmişti. Ancak kullanıcı kararıyla geri alındı: zayıf telefon/tablet → MP3 128kbps. Cookie yoksa da MP3 128kbps (güvenli taraf). 64kbps MP3 sadece admin tarafından kullanıcıya atanabilir.

Adım 4: PC → HLS
Masaüstü/Laptop → her zaman hls (full ABR, 4 seviye). Cookie kontrol edilmez.

Akış Özeti (Bir Bakışta)

FORCE? ──── evet ──→ Zorla format (mp3/hls/hls_soft) ■ BİTTİ
  │ hayır
ROOT _mz? ── evet ──→ Test formatı uygula ■ BİTTİ
  │ hayır
PREF? ───── auto değil → Kullanıcı tercihi ■ BİTTİ
  │ auto
CORPORATE? ─ >50 kişi → MP3 ■ BİTTİ
  │ hayır/yok
MOBİL? ───── good ───→ HLS TAM (4 seviye) ■ BİTTİ
  │            weak/yok → MP3 128k ■ BİTTİ
  │ PC
PC ────────────────→ HLS TAM (4 seviye) ■ BİTTİ

5. Soft Mode vs Level Lock — Fark Ne?

Özellik Soft Mode (hls_soft) Level Lock (hls_32/64/128)
Kullanılan variant sayısı 3 (varsayılan: ultralow+low+mid) 1 (sadece seçilen)
ABR (otomatik geçiş) EVET (3 seviye arası) HAYIR (sabit)
Max kalite 128 kbps (ENV'den ayarlanır) Seçime bağlı (32/64/128)
İnternet kötüleşirse 128→64→32'ye düşer (takılmaz) Düşemez, takılabilir
Şifreleme AES-128 (aynı key, farklı IV) AES-128 (aynı key, farklı IV)
Token flag userId.s userId.u / .l / .m / .h
Kullanım senaryosu İnternet dalgalı, bazen iyi bazen kötü İnternet sürekli aynı hızda ama düşük

Not: Soft Mode sadece admin ataması (hls_soft) veya kill switch (MUZIBU_AUDIO_FORCE=hls_soft) ile aktif olur. Otomatik karar zincirinde (Adım 3) mobil cihazlar artık Soft değil MP3 alıyor.

6. Admin Panel — Format Tercihi Dropdown

Dosya: user-manage-component.blade.php:184 — Kullanıcı düzenleme sayfasında:

--- Genel ---
  auto — 0 — Varsayılan (cihaz+internet otomatik)
--- Bütün (MP3) ---
  mp3_64 — 1. Seviye — En sorunlu müşteri
  mp3_128 — 2. Seviye — Sorunlu müşteri
  mp3_auto — Auto — Normal internet, normal cihaz
--- Parçalı (HLS) ---
  hls_32 — 1. Seviye — İnternet çok sorunlu (32k kilitli)
  hls_64 — 2. Seviye — İnternet sorunlu (64k kilitli)
  hls_soft — 1+2+3. Seviye — Soft — İnternet sorunlu ama cihaz iyi
  hls_128 — 3. Seviye — İyi cihaz, normal internet (128k kilitli)
  hls_auto — 0 — Auto — İyi cihaz, iyi internet (4 seviye ABR)

Bu ayar users.audio_preference alanına yazılır. Sadece Muzibu tenant'ında (1001) görünür.

7. Mobilde Ne Oluyor? — Güncel Durum v4 GÜNCEL

Mobil/Tablet tespiti jenssegers/agent kütüphanesi ile yapılır. UA hash'i 24 saat cache'lenir.

Cihaz mz_device Format Kalite Açıklama
Mobil good HLS 4 seviye ABR Güçlü telefon → tam kalite HLS
Mobil weak MP3 128 kbps Zayıf telefon → MP3 128kbps
Mobil yok MP3 128 kbps Cookie yok → güvenli taraf: MP3 128kbps
Tablet good HLS 4 seviye ABR Güçlü tablet → tam HLS
Tablet weak MP3 128 kbps Zayıf tablet → MP3 128kbps
PC HLS 4 seviye ABR PC her zaman HLS (cookie kontrol edilmez)
v3→v4 DEĞİŞİKLİK

v3: Zayıf mobil → Soft HLS (3 seviye ABR, şifreli)

v4: Zayıf mobil → MP3 128kbps (tek dosya, CPU yükü yok)

Neden geri dönüldü?
Zayıf telefonlarda HLS decoder işlemciye yük bindirir, batarya tüketir. MP3 tek dosya olduğundan işlemci kullanmaz. Ayrıca cookie olmayan durumda (ilk ziyaret, JS kapalı) güvenli tarafta kalmak önemli.

8. mz_device Cookie Sistemi

Dosya: player-core.js:110-143 — Sayfa yüklendiğinde JS ile hesaplanır:

Kriter 1: RAM

navigator.deviceMemory
≥ 4 GB → +1 puan
< 4 GB → 0 puan
Sadece Chrome/Edge/Opera destekler

Kriter 2: CPU

navigator.hardwareConcurrency
≥ 4 çekirdek → +1 puan
< 4 çekirdek → 0 puan

Kriter 3: Bağlantı

navigator.connection.effectiveType
4g → +1 puan
3g/2g/slow-2g → 0 puan
Network Info API gerekli
// Karar
const capability = score >= 2 ? 'good' : 'weak';
// Cookie yaz — 24 saat TTL
document.cookie = 'mz_device=' + capability + '; expires=24h; path=/; SameSite=Lax';
good (2+ puan)
Mobil/Tablet: Tam HLS (4 seviye ABR, şifreli, adaptif)
PC: Cookie kontrol edilmez, her zaman HLS
weak (0-1 puan) veya yok
Mobil/Tablet: MP3 128kbps (tek dosya, CPU yükü yok, batarya dostu)
PC: Cookie kontrol edilmez, her zaman HLS
Not: Cookie sadece bir kere hesaplanır (sayfa yüklendiğinde). Zaten varsa tekrar hesaplanmaz. 24 saat sonra süresi dolunca yeniden hesaplanır. EncryptCookies istisnasında: bootstrap/app.php:51

9. ENV Ayarları (11 Parametre)

Tüm MUZIBU_ ile başlayan ENV değişkenleri tek blokta. Değişiklik sonrası: php artisan config:cache

# ENV Değişkeni Değer Açıklama
1 MUZIBU_DEFAULT_AUDIO_FORMAT auto Varsayılan format (auto/hls/mp3)
2 MUZIBU_AUDIO_FORCE (boş) Acil override — doldurursan HERKESİ zorlar
3 MUZIBU_HLS_TIMEOUT 2 HLS başarısız → MP3 fallback bekleme (sn)
4 MUZIBU_SOFT_PLAYER_VARIANTS ultralow,low,mid Soft modda izin verilen HLS kaliteleri
5 MUZIBU_CROSSFADE_DURATION 7000 Crossfade süresi (ms) — 0=kapalı
6 MUZIBU_SESSION_POLLING 30000 Session polling aralığı (ms)
7 MUZIBU_SESSION_TTL 7200 Redis session süresi (sn)
8 MUZIBU_CACHE_PREMIUM_TTL 300 Premium durum cache (sn)
9 MUZIBU_CACHE_SONG_TTL 86400 Şarkı cache süresi (sn = 24h)
10 MUZIBU_DEVICE_LIMIT 1 Eşzamanlı cihaz limiti
11 MUZIBU_CORPORATE_MP3_THRESHOLD 50 Kurumsal hesap MP3 eşiği AKTİF

10. Kill Switch — Acil Override (MUZIBU_AUDIO_FORCE)

Herhangi bir acil durumda (HLS çöktü, sunucu yükü arttı, bug) tüm kullanıcıları tek satırla başka formata geçirebilirsin:

Değer Format Etki
(boş) Normal akış — karar zinciri çalışır
mp3_original MP3 Herkes orijinal MP3 dinler. HLS tamamen kapalı.
mp3_128 MP3 Herkes 128kbps MP3 dinler.
mp3_64 MP3 Herkes 64kbps MP3 dinler. En düşük bant genişliği.
hls HLS Herkes tam HLS dinler (4 seviye ABR).
hls_soft SOFT Herkes soft HLS dinler (varsayılan: ultralow+low+mid).
# Örnek: HLS sorun çıkardı, herkesi MP3'e geçir
MUZIBU_AUDIO_FORCE=mp3_original
php artisan config:cache
# Sorun düzeldi, normal akışa dön
MUZIBU_AUDIO_FORCE=
php artisan config:cache

11. Test Parametreleri (_mz) — Sadece Root

URL'ye ?_mz=kod eklenerek root kullanıcı herhangi bir formatı test edebilir:

MP3 Testleri (s = soft/mp3)

?_mz=s6 MP3 64kbps
?_mz=s12 MP3 128kbps (varsayılan)
?_mz=s0 MP3 Orijinal

HLS Testleri (h = hls)

?_mz=h3 HLS ultralow (32k kilitli)
?_mz=h6 HLS low (64k kilitli)
?_mz=h12 HLS mid (128k kilitli)
?_mz=h0 HLS high (orijinal kilitli)
?_mz=hsoft HLS Soft Mode testi

Token Flag Sistemi: _mz parametresi backend'de signed URL'nin token kısmına gömülür. Örnek: token=5.s (userId=5, flag=s=soft). Flag'ler: s=soft, u=ultralow, l=low, m=mid, h=high. serveHls() bu flag'i okuyup master.m3u8'den ilgili varyantları filtreler.

12. Player Hata Düzeltmeleri v4 YENİ

Dosya: player-core.js — Konsol loglarında tespit edilen 3 hata düzeltildi:

DÜZELTİLDİ unlockABR TypeError — flushMainBuffer null

Hata: Cannot read properties of null (reading 'trigger') — HLS.js dahili streamController henüz hazır değilken ABR kilidini açma girişimi.

Çözüm: unlockABR() fonksiyonuna guard eklendi:

// Guard: media ve streamController hazır mı?
if (_rawHls.media && _rawHls.streamController) {
    _rawHls.currentLevel = -1;
    _rawHls.autoLevelCapping = -1;
}
// + try-catch ile sarmalandı

Kök neden: currentLevel = -1 → immediateLevelSwitch → flushMainBuffer çağrılıyor ama media element null (destroyed veya henüz attach olmamış).

DÜZELTİLDİ track-end ve diğer API çağrıları 404

Hata: POST /api/muzibu/songs/{id}/track-end 404 — API route'ları domain-scoped (mztest.muzibu.com) ama JS relative URL kullanıyordu.

Çözüm: 5 fetch noktasında URL'ye window.location.origin prefix'i eklendi:

fetch(`/api/muzibu/songs/${songId}/track-end`, { ... })
fetch(`${window.location.origin}/api/muzibu/songs/${songId}/track-end`, { ... })

Etkilenen uç noktalar: track-start, track-hit, track-progress, track-end (fetch + sendBeacon)

DÜZELTİLDİ HlsPool overflow uyarıları

Hata: HlsPool overflow: aktif=2, poolSize=2 — Pool boyutu 2 iken current + preload + next pattern'i 3 instance gerektiriyordu.

Çözüm: Pool boyutu 2 → 3'e çıkarıldı. Normal davranış olduğundan console.warn kaldırıldı.

// Eski: _poolSize: 2
// Yeni: _poolSize: 3 // current + preload + next

13. Sorunlar & Durum v4 GÜNCEL

ÇÖZÜLDÜ MUZIBU_CORPORATE_MP3_THRESHOLD artık aktif

Eski: config/config.php:55'te tanımlıydı ama resolveAudioFormat() içinde hiçbir yerde kontrol edilmiyordu. Ölü ayardı.

Yeni: Karar zincirinin Adım 2'sine eklendi. Kurumsal hesapta 50'den fazla kullanıcı varsa otomatik MP3'e geçiyor. try-catch ile korumalı (test ortamında kolon yoksa hata vermez).

GERİ ALINDI Zayıf mobil: Soft HLS → MP3 128kbps

v3: Zayıf mobil (mz_device=weak) → Soft HLS. hls_soft_mobile format türü eklenmişti.

v4: Zayıf mobil → MP3 128kbps. hls_soft_mobile tamamen kaldırıldı (kodda hiçbir referansı kalmadı).

Neden: Zayıf telefonlarda HLS decoder CPU yükü + batarya tüketimi. Cookie olmayan durumda güvenli taraf = MP3.

ÇÖZÜLDÜ 3 player konsol hatası düzeltildi

unlockABR TypeError, track-end 404, HlsPool overflow — tamamı düzeltildi. Detaylar Bölüm 12'de.

BİLGİ Safari'de mz_device cookie kısıtlaması

navigator.deviceMemory Safari'de desteklenmiyor → bu kriter her zaman 0. Sadece CPU + bağlantı kalır.

Safari'de güçlü bir iPhone bile weak çıkabilir (2 kriter yerine max 2 — eşik geçiyor ama marj az).

Etki: Safari'de weak çıkan güçlü telefonlar MP3 128kbps alır. Müzik kalitesinde kayıp var ama çalma sorunu yok.

ÇÖZÜLDÜ Debug bilgisinde is_soft + root-only overlay

is_soft ve corporate_id alanları debug'a eklendi. Debug bilgisi artık root kullanıcıya görsel overlay (sağ alt köşe, 5sn sonra kaybolur) olarak gösteriliyor.

ÇÖZÜLDÜ v1 raporundaki soft = "ultralow+low" düzeltildi

v1 raporunda soft modda sadece 2 seviye (ultralow+low) gösteriliyordu. Gerçekte MUZIBU_SOFT_PLAYER_VARIANTS=ultralow,low,mid3 seviye. v2'de düzeltildi.

Durum Özeti

ÇÖZÜLDÜ 5 sorun düzeltildi (corporate, debug, rapor, player 3x)
GERİ ALINDI Zayıf mobil: Soft HLS → MP3 128k
BİLGİ 1 bilinen kısıtlama (Safari, sorun değil)
KALDIRILDI hls_soft_mobile format türü tamamen silindi

23 Şubat 2026 • Muzibu.com.tr

v4 — Güncel akış (MP3 mobil, player fix'ler) | v3: Soft HLS deneyimi | v2: Kapsamlı analiz | v1: İlk analiz