Safari iOS HLS + Bunny CDN

Sorunlar, Denemeler ve Geçiş Planı

23 Mart 2026 • v1

Basit Anlatım

Ne oldu? Bunny CDN'den müzik çalarken Safari iOS'ta 401 (yetkisiz) hatası aldık.

Neden? Safari'nin yerleşik HLS oynatıcısı, farklı sunuculara istek atarken kimlik bilgilerini göndermiyor.

Şu an? Bunny kapalı, tüm müzikler kendi sunucumuzdan çalıyor. Sorun yok.

İleride? Tüm MP3'ler Bunny'ye yüklenince, Safari için MP3 fallback ile hybrid moda geçeceğiz.

Problem Detayı

HLS Şifreleme Mimarisi

┌─────────────────────────────────────────────────────────────┐
│  HLS Akışı (Hybrid Mode)                                    │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  1. master.m3u8  ──────►  Bunny CDN (public)               │
│  2. playlist.m3u8 ─────►  Bunny CDN (public)               │
│  3. segment-XXX.ts ────►  Bunny CDN (AES-128 encrypted)    │
│  4. enc.key  ──────────►  www.muzibu.com (auth required!)  │
│                                                             │
│  Sorun: Safari iOS #4'ü çağırırken cookie göndermiyor      │
│         → 401 Unauthorized → Şarkı çalmıyor                │
│                                                             │
└─────────────────────────────────────────────────────────────┘

Teknik Sebep

  • Hls.isSupported() = false → Safari iOS'ta HLS.js çalışmıyor
  • Safari kendi native HLS player'ını kullanıyor
  • Playlist: muzibu-audio-cdn.b-cdn.net (Bunny)
  • Key: www.muzibu.com/hls-key/ (Bizim sunucu)
  • Cross-origin istek → Safari cookie göndermiyor → 401

Console Hatası

[Error] Failed to load resource: 401 Unauthorized
        https://www.muzibu.com/hls-key/muzibu/songs/23390?...

[Log] cdn-cache: BYPASS
[Log] cdn-requestpullcode: 401
[Log] server: BunnyCDN

Denenen Çözümler

1. Session Middleware Ekleme

MuzibuServiceProvider.php'ye session middleware eklendi

❌ Başarısız - Safari cross-origin'de cookie göndermiyor, session işe yaramaz

2. Blob URL ile Playlist Modifikasyonu

Playlist'leri fetch et → Key'i data:base64 olarak göm → Blob URL oluştur

// Key'i data URI olarak göm
URI="data:application/octet-stream;base64,{KEY_BASE64}"

// Playlist için blob URL oluştur
var blob = new Blob([modifiedPlaylist], {type: 'application/vnd.apple.mpegurl'});
var blobUrl = URL.createObjectURL(blob);

❌ Başarısız - Safari native HLS blob:// URL desteklemiyor

Hata: "NotSupportedError: The operation is not supported"

3. Safari iOS için MP3 Fallback

Safari iOS tespit et → API'ye ?force_mp3=1 ekle → MP3 URL dön

// Frontend
var isSafariIOS = /iPad|iPhone|iPod/.test(navigator.userAgent) &&
                  /Safari/.test(navigator.userAgent);
if (isSafariIOS) url += '?force_mp3=1';

// Backend
if ($request->has('force_mp3')) {
    return MP3_URL;  // HLS yerine MP3
}

⏸️ Test Edilmedi - Muhtemelen çalışır, Bunny'de MP3 yüklenince denenecek

4. Bunny'ye enc.key Yükleme

Şifreleme anahtarını da Bunny'ye yükle

❌ Reddedildi - Güvenlik riski, anahtarlar public olmamalı

5. Playlist'leri Yeniden Encode

Key URI'lerini değiştirip playlist'leri yeniden oluştur

❌ Reddedildi - 40K+ şarkı var, çok uzun sürer

Mevcut Durum (23 Mart 2026)

.env Ayarları

BUNNY_STORAGE_ENABLED=true
BUNNY_STORAGE_MODE=local      ← Şu an local
BUNNY_FALLBACK_TO_LOCAL=true

Çalışma Durumu

  • ✅ Chrome/Firefox/Edge → HLS çalışıyor
  • ✅ Safari macOS → HLS çalışıyor
  • ✅ Safari iOS → HLS çalışıyor (local'den)
  • ✅ Android → HLS çalışıyor

Bunny CDN Geçiş Planı

Ön Koşullar (Bunny'ye Geçmeden Önce)

Geçiş Adımları

  1. 1

    MP3 Yükleme Tamamla

    Bunny migration script ile tüm MP3'leri yükle

    php artisan bunny:migrate --type=mp3
  2. 2

    Safari iOS MP3 Fallback Ekle

    player-core.js'e Safari iOS tespiti + force_mp3 ekle

    // Safari iOS → API'ye ?force_mp3=1
    // Backend → HLS yerine MP3 URL dön
  3. 3

    Test (Local Mode'da)

    Safari iOS'ta MP3 fallback'i test et

  4. 4

    Hybrid Moda Geç

    # .env
    BUNNY_STORAGE_MODE=hybrid
    
    # Cache temizle
    php artisan config:cache
  5. 5

    Canlı Test

    Tüm cihazlarda test et: Chrome, Safari macOS, Safari iOS, Android

Hybrid Mode'da Beklenen Davranış

Cihaz/Tarayıcı Format Kaynak
Chrome / Firefox / Edge HLS (HLS.js) Bunny CDN
Safari macOS HLS (Native) Bunny CDN + Local Key
Safari iOS MP3 (Fallback) Bunny CDN
Android Chrome HLS (HLS.js) Bunny CDN

Git Geçmişi

eb0acb8ff  23 Mar 05:XX  🔙 Safari iOS denemelerini geri al + Bunny local moda
83d1043bd  23 Mar 05:XX  🍎 Safari iOS HLS Denemeleri (HATALI)
f2ef4bcbd  22 Mar 22:56  🐰 Bunny Hybrid Serving + Redis Tracking
b489ec4fa  22 Mar 22:41  🐰 Bunny Migration optimizasyonları
55ff250f8  21 Mar 00:27  🐰 Bunny Storage Zone entegrasyonu

Geri almak için:

git checkout f2ef4bcbd -- [dosyalar]

İlgili Dosyalar