HLS keyLoadError Analiz & Düzeltme Raporu

22 Şubat 2026 • Muzibu.com.tr

Kritik Bug Düzeltildi

Basit Anlatım (Herkes İçin)

Sorun Ne?

Müzik dinlerken şarkılar en düşük kalitede çalıyordu. İnternet hızınız ne kadar iyi olursa olsun, herkes 64kbps'lik (telefon kalitesinin bile altında) ses duyuyordu. Orijinal kalite hiç çalmıyordu.

Neden?

Şarkıları korumak için kullandığımız şifreleme sisteminde bir hata vardı. Orijinal kaliteli dosyaların "şifre kombinasyonu" (IV değeri) sıfır olarak yazılmıştı. Bu yüzden orijinal kalite çözülemiyordu ve devre dışı bırakılmıştı.

Ne Değişti?

  • Artık 3 kalite seviyesi aktif: düşük (32kbps), orta (64kbps), orijinal (~180-280kbps)
  • İnternet hızına göre otomatik kalite seçimi çalışıyor
  • 66 şarkı yeniden encode edildi

Teknik Detaylar (Geliştiriciler İçin)

Bug 1: IV=0x00 (Sıfır Initialization Vector)

Dosya: Modules/Muzibu/App/Jobs/ConvertToHLSJob.php:95-98

// ESKİ KOD (HATALI):
$keyInfoContent = $keyUri . "\n" . $keyPath . "\n";
// 3. satır (IV) yazılmamış! FFmpeg IV=0x0000...0000 kullanıyor
// YENİ KOD (DÜZELTİLMİŞ):
$iv = bin2hex(random_bytes(16));
$keyInfoContent = $keyUri . "\n" . $keyPath . "\n" . $iv;
// Artık her şarkı benzersiz IV alıyor

AES-128 şifrelemede IV (Initialization Vector) her şarkı için benzersiz olmalı. Sıfır IV kullanmak hem güvenlik açığı hem de HLS.js'te "decryptdata unset or changed" hatasına neden oluyor.

Bug 2: Yanlış Bitrate Hesabı (669kbps Hayalet)

Dosya: app/Services/Muzibu/HLSService.php:509

// ESKİ KOD (HATALI):
$highBitrate = round($totalSize / ($segCount * self::CHUNK_DURATION) * 8);
// CHUNK_DURATION=4sn ama orijinal segmentler 10sn → 2.5x şişik hesap
// Sonuç: 268kbps yerine 669kbps yazıyordu
// YENİ KOD (DÜZELTİLMİŞ):
// Playlist'ten gerçek #EXTINF sürelerini topla
preg_match_all('/#EXTINF:([\d.]+),/', $playlistContent, $matches);
$highBitrate = round($totalSize * 8 / $totalDuration);
// Artık gerçek süre kullanılıyor
ŞarkıOrijinal MP3Eski master.m3u8Yeni master.m3u8
34455180 kbps669 kbps213 kbps
34456195 kbps~670 kbps280 kbps
34501~250 kbps~670 kbps285 kbps

Bug 3: Orijinal Kalite Filtrelenmişti

Dosya: Modules/Muzibu/App/Http/Controllers/Api/SongStreamController.php:746-755

// ESKİ KOD: Orijinal kaliteyi master.m3u8'den siliyordu
$content = preg_replace(
    '/^#EXT-X-STREAM-INF:[^\n]*\nplaylist\.m3u8\n?/m',
    '', $content  // HIGH SİLİNİYORDU!
);
// YENİ KOD: Orijinal dahil tüm kaliteler sunuluyor
// + High playlist'e de query parametreleri ekleniyor
// + High segmentleri de storage URL'sine yönlendiriliyor
// + High key URI'sine &level=high ekleniyor (race condition önlemi)

Değişiklik: Segment Süresi 10sn → 6sn

Dosya: Modules/Muzibu/App/Jobs/ConvertToHLSJob.php:137

KaliteEski SegmentYeni Segment
Ultralow (32kbps)4 sn4 sn
Low (64kbps)4 sn4 sn
Orijinal (~180-280kbps)10 sn6 sn

Yeniden Encode Sonuçları

66
Toplam Şarkı
İşleniyor...
Başarılı
-
Başarısız

Sadece orijinal (high) kalite yeniden encode edildi. Ultralow ve low'a dokunulmadı. Her şarkıya benzersiz IV atandı, segment süresi 6 saniyeye düşürüldü.

Değişen Dosyalar

DosyaDeğişiklik
Modules/Muzibu/App/Jobs/ConvertToHLSJob.php IV eklendi + segment 10sn → 6sn
app/Services/Muzibu/HLSService.php Bitrate hesabı: CHUNK_DURATION yerine gerçek EXTINF süresi
Modules/Muzibu/.../SongStreamController.php High filtre kaldırıldı + query param + segment URL + level=high
storage/.../hls/*/playlist.m3u8 66 şarkı yeniden encode (IV + 6sn segment + master.m3u8)

Öncesi / Sonrası Karşılaştırma

Öncesi

  • Ultralow: 32kbps
  • Low: 64kbps
  • Orijinal: KAPALI
  • Max kalite: 64kbps
  • IV: sıfır (güvenlik açığı)
  • Bitrate raporu: 669kbps (yanlış)
  • keyLoadError: sık oluşuyor

Sonrası

  • Ultralow: 32kbps
  • Low: 64kbps
  • Orijinal: ~180-280kbps
  • Max kalite: orijinal MP3 kalitesi
  • IV: benzersiz (güvenli)
  • Bitrate raporu: gerçekçi
  • keyLoadError: düzeltilmeli

Nasıl Çalışıyor (ABR Akışı)

Şarkı başlat
Ultralow (32kbps) ile başla — hızlı başlangıç
↓ internet hızı ölçülür
Low (64kbps) — orta bağlantı
↓ hız yeterliyse
Orijinal (~180-280kbps) — en iyi kalite
22 Şubat 2026 • Muzibu.com.tr