🔴 KRİTİK BULGU v5 📊 Database Analizi

Muzibu Ses Kalitesi - Database Durumu

HLS Conversion Hiç Yapılmamış! (file_path = hls_path)

8 Ocak 2026
muzibu.com

🔴 KRİTİK DATABASE BULGUSU

⚠️ Ana Problem: HLS Hiç Dönüştürülmemiş!

Bulgu: file_path ve hls_path kolonları AYNI DEĞERLERİ içeriyor!

Her iki kolon da aynı MP3 dosyasını gösteriyor. HLS playlist path'i yok!

song_id | title              | file_path                              | hls_path
--------|--------------------|-----------------------------------------|------------------------------------------
51      | Şehir              | 1/blues-rock-turkce--xx--3/ah-bu-...  | 1/blues-rock-turkce--xx--3/ah-bu-...
159     | Black Dust Boogie  | 1/british-blues--xx--7/black-dust-... | 1/british-blues--xx--7/black-dust-...
160     | Blackwater Lament  | 1/british-blues--xx--7/blackwater-... | 1/british-blues--xx--7/blackwater-...

❌ YANLIŞ: file_path = hls_path = "1/blues-rock-turkce--xx--3/ah-bu-sehir.mp3"
✅ DOĞRU OLABİLİRDİ: hls_path = "muzibu/hls/51/playlist.m3u8"
28,211
Toplam Şarkı
28,208
hls_path Dolu (YANLIŞ!)
3
file_path NULL

📊 Sonuç:

  • HLS conversion hiç yapılmamış
    ConvertToHLSJob.php kodu var ama hiç çalıştırılmamış
  • hls_path kolonu yanlış doldurulmuş
    MP3 path yazılmış, HLS playlist path değil
  • Sistem şu anda direkt MP3 stream ediyor
    file_path ve hls_path aynı dosyayı gösteriyor
  • ⚠️
    Backend FFmpeg filtreleri hiç uygulanmamış
    Loudnorm, EQ, Stereo, Lowpass → Hiçbiri yok!

🗄️ Database Schema Analizi

📋 muzibu_songs Tablosu - İlgili Kolonlar:

Field          | Type          | Null | Default
---------------|---------------|------|--------
song_id        | bigint(20)    | NO   | AUTO
file_path      | varchar(255)  | YES  | NULL      ← Orijinal MP3 path
hls_path       | varchar(500)  | YES  | NULL      ← HLS playlist path (YANLIŞ KULLANILMIŞ!)
encryption_key | varchar(32)   | YES  | NULL
encryption_iv  | varchar(32)   | YES  | NULL

⚠️ Neden file_path = hls_path?

Muhtemelen şarkı upload olurken:

// Upload işlemi (tahmini):
$song->file_path = $mp3Path;    // "1/genre/song-slug.mp3"
$song->hls_path  = $mp3Path;    // ❌ YANLIŞ! (aynı path kopyalandı)
$song->save();

// Doğru olsaydı:
$song->file_path = $mp3Path;              // "1/genre/song-slug.mp3"
$song->hls_path  = null;                  // ✅ NULL olmalıydı (henüz dönüşmedi)
// Sonra ConvertToHLSJob çalışınca:
$song->hls_path  = "muzibu/hls/51/playlist.m3u8";  // ✅ HLS path yazılmalıydı

🔴 HATA DÜZELTMESİ (v3'ten)

❌ v3'te Yanlış Olan:

"Free kullanıcılar Standard kalitede dinler" denilmişti. BU YANLIŞ!

Gerçek Sistem: Free kullanıcılar hiç müzik dinleyemez!
Backend API (SongStreamController.php) free kullanıcıya 402 döner, subscription sayfasına yönlendirir.

✅ v4'te Doğru Olan:

Sadece Premium/Trial kullanıcılar müzik dinleyebilir.
Kalite seçimi algoritması sadece onlar için çalışır.

📝 Basit Anlatım (Herkes İçin)

🎯 Ne Yapacağız?

Premium/Trial kullanıcılar için sistem otomatik olarak en uygun ses kalitesini seçecek. Kullanıcı hiçbir buton görmeyecek, hiç uğraşmayacak!

🔴 Neden Frontend'de Yapıyoruz?

Backend'de HLS conversion hiç yapılmamış. 28,000+ şarkıyı backend'de yeniden işlemek:

  • • 📦 Disk: 28K şarkı × 3 kalite = 84K dosya (yüzlerce GB)
  • • ⏱️ Süre: 28K şarkı × 30 saniye = 234 saat (10 gün non-stop!)
  • • 💰 Maliyet: Sunucu CPU, disk, bandwidth
  • • 🐛 Risk: 28K şarkının tamamı yeniden işlenmeli

✅ Frontend Çözümü: Web Audio API ile real-time filtre uygula. Disk kullanmaz, backend'e yük bindirmez, anında çalışır!

⚠️ Önemli: Kimler Müzik Dinleyebilir?

✅ Premium/Trial Kullanıcılar:

Müzik dinleyebilir, otomatik kalite seçimi çalışır.

❌ Free Kullanıcılar:

Play butonuna basınca subscription sayfasına yönlendirilir. Hiç çalmaz!

🤖 Sistem Neye Göre Karar Verir?

  • 📶
    1. İnternet Hızı:

    • Yavaş bağlantı (4G, 3G, < 5 Mbps) → Optimized
    • Orta hız (WiFi, 5-10 Mbps) → EQ Balanced
    • Hızlı (WiFi 5GHz, Fiber, > 10 Mbps) → Ultimate

  • 📱
    2. Cihaz Tipi:

    • Mobil (telefon) → Batarya ve CPU dostu kalite
    • Tablet → Orta-yüksek kalite
    • Desktop → En yüksek kalite (Ultimate)

  • 🔋
    3. Batarya Durumu (Mobil):

    • Batarya %20'nin altında → Optimized (enerji tasarrufu)
    • Batarya normal → İnternet hızına göre

🎚️ Otomatik Seçilen Kalite Seviyeleri:

  • 🟢
    Optimized: Yavaş internet, mobil veri, düşük batarya (256 kbps + Loudnorm)
  • 🟡
    EQ Balanced: Orta hız WiFi, tablet (Optimized + EQ)
  • 🔴
    Ultimate: Hızlı WiFi + desktop (Tüm filtreler - Backend FFmpeg ile aynı)

Not: Standard kalitesi kaldırıldı. Premium kullanıcılar minimum Optimized kalitede dinler.

✨ Kullanıcı Deneyimi

  1. 1. Premium kullanıcı sitede geziniyor
  2. 2. Şarkıya play basıyor
  3. 3. Sistem arka planda 0.5 saniyede analiz ediyor:
    • • İnternet: WiFi 50 Mbps ✓
    • • Cihaz: Desktop ✓
    • • Batarya: Tam (desktop) ✓
  4. 4. → Karar: Ultimate kalite
  5. 5. Web Audio API filtreleri devreye giriyor (kullanıcı fark etmiyor)
  6. 6. Müzik profesyonel kalitede çalıyor 🎵

⚙️ Ayarlar Sayfasında (Opsiyonel)

Premium kullanıcı istersa Ayarlar > Ses Kalitesi bölümünden global tercihini değiştirebilir:

  • Otomatik (Önerilen): Sistem karar verir (varsayılan) ✓
  • Her Zaman Yüksek Kalite: Her durumda Ultimate kullan
  • Veri/Batarya Tasarrufu: Her durumda Optimized kullan

🤖 Otomatik Seçim Algoritması (Basitleştirilmiş)

📊 Karar Akışı:

1. CİHAZ TİPİ & BATARYA
   ├─ Mobil cihaz?
   │  ├─ Batarya < %20?
   │  │  └─ YES → 🟢 OPTIMIZED (enerji tasarrufu)
   │  └─ NO → 2. ADIMA GEÇ
   │
   └─ Desktop/Tablet → 2. ADIMA GEÇ

2. İNTERNET HIZI (Navigator.connection API)
   ├─ Çok yavaş (< 1 Mbps, 2G/3G)?
   │  └─ YES → 🟢 OPTIMIZED
   │
   ├─ Yavaş (1-5 Mbps, 4G)?
   │  └─ YES → 🟢 OPTIMIZED
   │
   ├─ Orta (5-10 Mbps, LTE/WiFi)?
   │  └─ YES → 🟡 EQ BALANCED
   │
   └─ Hızlı (> 10 Mbps, WiFi 5GHz/Fiber)?
      ├─ Desktop? → 🔴 ULTIMATE
      └─ Mobil/Tablet? → 🟡 EQ BALANCED

3. KULLANICI TERCİHİ (Ayarlar sayfası - opsiyonel override)
   ├─ "Otomatik" seçili? → Yukarıdaki algoritma geçerli
   ├─ "Her Zaman Yüksek Kalite"? → 🔴 ULTIMATE (zorla)
   └─ "Veri/Batarya Tasarrufu"? → 🟢 OPTIMIZED (zorla)

🎬 Örnek Senaryolar:

📱 Senaryo 1: Mobil + 4G + Premium

Durum: Telefon, 4G (3 Mbps), Premium üyelik, Batarya %60
Analiz: Mobil + Batarya OK → İnternet yavaş (4G, 3 Mbps)
Sonuç: 🟢 OPTIMIZED

Mobil veri tasarrufu + CPU dostu. 4G'de buffering olmasın.

💻 Senaryo 2: Desktop + WiFi Fiber + Premium

Durum: Desktop, WiFi 100 Mbps, Premium üyelik
Analiz: Desktop ✓ → Hızlı internet (100 Mbps) ✓
Sonuç: 🔴 ULTIMATE

En yüksek kalite: Loudnorm + Stereo + EQ + Lowpass (Backend FFmpeg ile aynı)

📱 Senaryo 3: Mobil + WiFi + Düşük Batarya + Premium

Durum: Telefon, WiFi 50 Mbps, Premium, Batarya %15
Analiz: Mobil + Batarya %15 → Batarya tasarrufu öncelikli
Sonuç: 🟢 OPTIMIZED

WiFi hızlı olsa bile batarya %20'nin altında ise enerji tasarrufu önemli.

📱 Senaryo 4: Tablet + WiFi + Premium

Durum: iPad, WiFi 30 Mbps, Premium, Batarya %80
Analiz: Tablet → Batarya OK ✓ → WiFi orta-hızlı (30 Mbps)
Sonuç: 🟡 EQ BALANCED

Tablet'te iyi kalite ama Ultimate kadar CPU yükü yok.

🔧 Teknik Detaylar (Geliştiriciler İçin)

🎯 Otomatik Seçim Fonksiyonu (Basitleştirilmiş)

async function autoSelectQuality() {
  // NOT: Bu fonksiyon sadece Premium/Trial kullanıcılar için çağrılır
  // Free kullanıcılar zaten API'dan 402 alır, müzik çalmaz

  // 1. Kullanıcı tercihi (ayarlar sayfası - opsiyonel override)
  const userPreference = localStorage.getItem('audio_quality_preference');
  if (userPreference === 'always_high') {
    return 'ultimate'; // Kullanıcı zorladı
  }
  if (userPreference === 'data_saver') {
    return 'optimized'; // Kullanıcı zorladı
  }

  // 2. Mobil cihaz + batarya kontrolü
  if (isMobile) {
    try {
      const battery = await navigator.getBattery();
      if (battery.level < 0.2 && !battery.charging) {
        return 'optimized'; // Düşük batarya → Tasarruf
      }
    } catch (e) {
      // Battery API desteklenmiyorsa devam et
    }
  }

  // 3. İnternet hızı kontrolü
  const connection = navigator.connection;
  if (connection) {
    const downlink = connection.downlink; // Mbps
    const effectiveType = connection.effectiveType;

    // Çok yavaş/yavaş bağlantı
    if (downlink < 5 || effectiveType === 'slow-2g' || effectiveType === '2g' || effectiveType === '3g') {
      return 'optimized';
    }

    // Orta hız (LTE, WiFi orta)
    if (downlink < 10) {
      return 'eq_balanced';
    }

    // Hızlı bağlantı (WiFi 5GHz, Fiber)
    return isDesktop ? 'ultimate' : 'eq_balanced';
  }

  // 4. Fallback: Cihaz tipine göre varsayılan
  if (isDesktop) {
    return 'ultimate'; // Desktop → En yüksek kalite
  } else if (isTablet) {
    return 'eq_balanced'; // Tablet → Orta-yüksek
  } else {
    return 'optimized'; // Mobil → Dengeli
  }
}

// Kullanımı (player-core.js içinde):
const selectedQuality = await autoSelectQuality();
player.applyQualityPreset(selectedQuality);
console.log('Otomatik seçilen kalite:', selectedQuality);

🎚️ Kalite Presets (3 Seviye - Standard Kaldırıldı)

const QUALITY_PRESETS = {
  // Standard KALDIRILDI - Premium kullanıcılar minimum Optimized

  optimized: {
    label: 'Optimized',
    description: '256 kbps + Loudness normalize',
    filters: {
      gain: 1.2,           // +2dB (loudness normalize)
      eq: [],              // EQ YOK
      stereo: 0,           // Stereo YOK
      lowpass: false       // Lowpass YOK
    }
  },

  eq_balanced: {
    label: 'EQ Balanced',
    description: '256 kbps + Loudness + EQ',
    filters: {
      gain: 1.2,
      eq: [
        { type: 'peaking', frequency: 100, Q: 1, gain: 1 },    // Bass +1dB
        { type: 'peaking', frequency: 8000, Q: 1, gain: -2 }   // Treble -2dB
      ],
      stereo: 0,
      lowpass: false
    }
  },

  ultimate: {
    label: 'Ultimate',
    description: 'Tüm filtreler (Backend FFmpeg ile aynı)',
    filters: {
      gain: 1.2,           // Loudness
      eq: [
        { type: 'peaking', frequency: 100, Q: 1, gain: 1 },    // Bass +1dB @ 100Hz
        { type: 'peaking', frequency: 8000, Q: 1, gain: -2 }   // Treble -2dB @ 8kHz
      ],
      stereo: 0.2,         // Stereo widening (20%)
      lowpass: 14000       // 14kHz lowpass
    }
  }
};

📡 Kullanılacak JavaScript API'ler

  • Navigator.connection → İnternet hızı (Mbps, 4G/3G/WiFi)
  • Battery Status API → Batarya seviyesi (mobil)
  • User Agent → Mobil/Desktop tespiti

📁 Dosya Konumları

  • JS: public/themes/muzibu/js/player/features/auto-quality.js
  • Core: public/themes/muzibu/js/player/core/player-core.js (güncellenecek)
  • Ayarlar: resources/views/themes/muzibu/profile/settings.blade.php (opsiyonel)

📊 Yapılacaklar (Adım Adım)

1 Auto Quality Modülü Oluştur

  • auto-quality.js dosyası
  • autoSelectQuality() fonksiyonu (Premium için)
  • ✅ Network, Battery, Device detection API'leri
  • ✅ QUALITY_PRESETS (3 seviye: Optimized, EQ Balanced, Ultimate)

2 Player Core Entegrasyonu

  • ✅ AudioContext + Web Audio pipeline
  • ✅ Şarkı başlamadan önce autoSelectQuality() çağır
  • ✅ Seçilen preset'i uygula (GainNode, EQ, Stereo, Lowpass)
  • ✅ Console log: "Seçilen kalite: Ultimate (Desktop + WiFi 100Mbps)"

3 Ayarlar Sayfası (Opsiyonel)

  • ✅ Settings > "Müzik & Ses" bölümü
  • ✅ 3 radio button: Otomatik / Her Zaman Yüksek / Veri Tasarrufu
  • ✅ LocalStorage kaydet: audio_quality_preference

4 Test

  • ✅ Premium + Desktop + WiFi → Ultimate
  • ✅ Premium + Mobil + 4G → Optimized
  • ✅ Premium + Mobil + Düşük batarya → Optimized
  • ✅ Premium + Tablet + WiFi → EQ Balanced
  • ✅ Ultimate = Backend FFmpeg ile aynı çıktı?

🚀 Sonraki Adım: Onay

💬 Bu planı onaylıyor musunuz?

  • Evet: Koda geçiyoruz (auto-quality.js + player entegrasyonu)
  • Hayır: Neyi değiştirmek istersiniz?

📌 v5 Değişiklik Özeti (v4'ten farklar):

  • EKLENDI: Database durumu analizi (file_path = hls_path bulgusu)
  • EKLENDI: HLS conversion hiç yapılmamış açıklaması
  • EKLENDI: Neden frontend çözümü tercih edildiği (maliyet, süre, risk)
  • Değişmedi: Algoritma, Web Audio API, kalite presets