iOS Safari HLS şifreleme sorunu çözümü + ENV tabanlı mod değiştirme + Hibrit serving mimarisi
Sorun: iPhone/iPad'lerde şarkılar çalmıyor çünkü Safari "şifre anahtarını" alamıyor.
Müzik dosyalarımız şifreli (korsanlığa karşı koruma). Her şarkıyı çalmak için bir "anahtar" lazım. Bu anahtar bizim sunucumuzda (muzibu.com). Ama dosyalar Bunny'de (audio.muzibu.com). Safari farklı sitelerden "anahtar" istemeyi reddediyor → Şarkı çalmıyor.
1. Player → Bunny'den master.m3u8 iste
2. master.m3u8 içinde KEY URL var:
#EXT-X-KEY:URI="https://www.muzibu.com/hls-key/..."
3. Safari native player → Key URL'e git
4. Cookie GÖNDERMİYOR (cross-origin)
5. Sunucu → 401 Unauthorized
6. ❌ Şarkı çalmıyor
Çözüm: iPhone/iPad'lere farklı format gönder (MP3). Şifreleme gerektirmiyor.
PC kullanıcılarına kaliteli HLS (adaptif), iOS kullanıcılarına MP3 (128kbps) vereceğiz. MP3 dosyaları zaten Bunny'de mevcut (33,103 adet mp3_128 formatı). Ekstra yükleme YOK.
iOS/Safari algıla → Otomatik MP3 formatına düşür. HLS denemesi bile yapma.
ÖNERİLENKey endpoint'ine HMAC imzalı token ekle. Cookie yerine URL parametresi kullan.
KARMAŞIKlocal/hybrid/bunny modları. Sorun olursa anında local'e dön.
ZORUNLU| Mod | HLS Kaynak | MP3 Kaynak | Key Kaynak | Kullanım |
|---|---|---|---|---|
local |
www.muzibu.com | www.muzibu.com | www.muzibu.com | Mevcut durum |
hybrid |
audio.muzibu.com (Bunny) | audio.muzibu.com (Bunny) | www.muzibu.com (Local) | HEDEF |
bunny |
audio.muzibu.com | audio.muzibu.com | audio.muzibu.com | Şu an imkansız (key güvenliği) |
# .env dosyasına eklenecek yeni ayarlar
# Storage mod kontrolü: local | hybrid | bunny
BUNNY_STORAGE_MODE=hybrid
# iOS/Safari için otomatik MP3 fallback
BUNNY_IOS_FORCE_MP3=true
# HLS key serving için signed URL kullan (cookie yerine)
BUNNY_HLS_KEY_SIGNED=true
# Hybrid modda fallback süresi (saniye)
BUNNY_HYBRID_TIMEOUT=3
Modules/Muzibu/App/Http/Controllers/Api/SongStreamController.php
resolveAudioFormat() → iOS/Safari tespiti ekle, mode kontrolü
app/Services/Bunny/BunnyStorageService.php
getAudioUrl() → Mode-aware URL generation
config/services.php
Yeni ENV değişkenleri tanımla
Modules/Muzibu/config/config.php
iOS fallback ayarları
public/themes/muzibu/js/player/features/device-profiler.js
iOS Safari detection güçlendir
public/themes/muzibu/js/player/core/audio-manager.js
Bunny URL handling (varsa)
.env
Yeni BUNNY_* değişkenleri
.env.example
Dokümantasyon için
Yeni ENV değişkenlerini tanımla ve config'e bağla
Backend'de güvenilir iOS/Safari tespiti
Storage moduna göre URL üretimi
Cookie yerine URL parametresi ile auth
Aşamalı geçiş
┌─────────────────────────────────────────────────────────────────────────┐
│ resolveAudioSource() │
└─────────────────────────────────────────────────────────────────────────┘
│
┌───────────────┴───────────────┐
│ BUNNY_STORAGE_MODE nedir? │
└───────────────┬───────────────┘
┌───────────────────────┼───────────────────────┐
│ │ │
┌───┴───┐ ┌────┴────┐ ┌────┴────┐
│ local │ │ hybrid │ │ bunny │
└───┬───┘ └────┬────┘ └────┬────┘
│ │ │
│ ┌─────┴─────┐ │
│ │ iOS/Safari│ │
│ │ mi? │ │
│ └─────┬─────┘ │
│ ┌────────┼────────┐ │
│ │ │ │ │
│ ┌───┴───┐┌───┴───┐ │ │
│ │ Evet ││ Hayır │ │ │
│ └───┬───┘└───┬───┘ │ │
│ │ │ │ │
│ ┌─────┴───┐ ┌──┴────┐ │ │
│ │ MP3 │ │ HLS │ │ │
│ │ (Bunny) │ │(Bunny)│ │ │
│ └─────────┘ └───────┘ │ │
│ │ │
┌───────┴───────┐ ┌───────┴───────┐ │
│ Local Signed │ │ Bunny Direct │ │
│ URL │ │ + Fallback │ │
└───────────────┘ └───────────────┘ │
│
┌───────┴───────┐
│ Bunny Direct │
│ (key dahil) │
└───────────────┘
⚠️ iOS'ta
çalışmaz!
PC kullanıcıları MP3'e düşebilir (kalite kaybı)
hybrid modda fallback çalışmazsa şarkılar çalmaz
Eski URL'ler cache'de kalabilir
iOS trafiği fazlaysa Bunny maliyeti artabilir
| Konu | Detay |
|---|---|
| Değişecek Dosya | 6-8 dosya |
| Tahmini Değişiklik | ~300 satır kod |
| Migration Gerekli mi? | HAYIR (sadece kod değişikliği) |
| Geri Dönüş | ENV değişikliği ile anında (BUNNY_STORAGE_MODE=local) |
| Mevcut Şarkılar | 33,112 HLS + 33,103 MP3 zaten Bunny'de |
| iOS Çözümü | Otomatik MP3 fallback (Bunny'den) |
| PC Çözümü | HLS ABR (Bunny'den, key local'den) |
Yukarıdaki plan uygun mu? Onaylarsanız TODO listesi oluşturup implementasyona başlayacağım.