Bunny CDN + iOS

Bunny Storage Entegrasyonu İmplementasyon Planı

iOS Safari HLS şifreleme sorunu çözümü + ENV tabanlı mod değiştirme + Hibrit serving mimarisi

Tamamlandı
33,112
Şarkı Bunny'de
Mevcut Mod
LOCAL
BUNNY_STORAGE_MODE
Kritik Sorun
iOS HLS
Key Auth Hatası
Hedef
HYBRID
iOS: MP3, PC: HLS

Problem Analizi

Basit Anlatım (Herkes İçin)

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.

Teknik Detaylar (Geliştiriciler İçin)

HLS Akışı

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

Neden Sadece iOS?

  • PC Chrome/Firefox: HLS.js kullanıyor → Cookie gönderebilir
  • Android: HLS.js kullanıyor → Cookie gönderebilir
  • iOS Safari: Native player → Cross-origin cookie YOK
  • iOS Chrome/Firefox: Aslında Safari engine → Aynı sorun

Çözüm Stratejisi

Basit Anlatım

Çö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.

🎯

Strateji 1: iOS MP3 Fallback

iOS/Safari algıla → Otomatik MP3 formatına düşür. HLS denemesi bile yapma.

ÖNERİLEN
🔑

Strateji 2: Signed Key URL

Key endpoint'ine HMAC imzalı token ekle. Cookie yerine URL parametresi kullan.

KARMAŞIK
⚙️

Strateji 3: ENV Mode Switch

local/hybrid/bunny modları. Sorun olursa anında local'e dön.

ZORUNLU

ENV Storage Modları

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 Değişiklikleri

# .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

Değişecek Dosyalar

Backend (PHP/Laravel)

Modules/Muzibu/App/Http/Controllers/Api/SongStreamController.php

resolveAudioFormat() → iOS/Safari tespiti ekle, mode kontrolü

~150 satır
app/Services/Bunny/BunnyStorageService.php

getAudioUrl() → Mode-aware URL generation

~80 satır
config/services.php

Yeni ENV değişkenleri tanımla

~20 satır
Modules/Muzibu/config/config.php

iOS fallback ayarları

~15 satır

Frontend (JavaScript)

public/themes/muzibu/js/player/features/device-profiler.js

iOS Safari detection güçlendir

~30 satır
public/themes/muzibu/js/player/core/audio-manager.js

Bunny URL handling (varsa)

~20 satır

Konfigürasyon

.env

Yeni BUNNY_* değişkenleri

~10 satır
.env.example

Dokümantasyon için

~10 satır

İmplementasyon Aşamaları

1

ENV Altyapısı

Yeni ENV değişkenlerini tanımla ve config'e bağla

  • config/services.php → bunny_storage array güncelle
  • Modules/Muzibu/config/config.php → ios_fallback ayarları
  • .env → Yeni değişkenler ekle (BUNNY_STORAGE_MODE=local kalacak)
2

iOS/Safari Tespiti

Backend'de güvenilir iOS/Safari tespiti

  • SongStreamController → isIosSafari() metodu
  • User-Agent parsing: iPhone, iPad, iPod, Safari
  • resolveAudioFormat() → iOS ise MP3'e zorla
3

BunnyStorageService Mode-Aware

Storage moduna göre URL üretimi

  • getAudioUrl($songId, $format) → Mode kontrolü
  • local: Signed local URL
  • hybrid: Bunny'de varsa Bunny, yoksa local
  • bunny: Direkt Bunny (fallback ile)
4

HLS Key Signed URL (Opsiyonel)

Cookie yerine URL parametresi ile auth

  • Key endpoint'e signed token desteği
  • Playlist içinde key URL'e token ekle
  • Bu aşama iOS MP3 çözümü yeterliyse atlanabilir
5

Test & Aktivasyon

Aşamalı geçiş

  • local modda test (mevcut durumun bozulmadığını doğrula)
  • hybrid modda test (PC'de Bunny HLS, iOS'ta Bunny MP3)
  • .env → BUNNY_STORAGE_MODE=hybrid

Karar Akışı (Hybrid Mod)


┌─────────────────────────────────────────────────────────────────────────┐
│                        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!

Risk Analizi

Yüksek Risk

  • iOS tespiti yanlış çalışırsa

    PC kullanıcıları MP3'e düşebilir (kalite kaybı)

  • Bunny CDN kesintisi

    hybrid modda fallback çalışmazsa şarkılar çalmaz

Orta Risk

  • Cache invalidation

    Eski URL'ler cache'de kalabilir

  • MP3 bandwidth artışı

    iOS trafiği fazlaysa Bunny maliyeti artabilir

Mitigasyon (Risk Azaltma)

  • Anında geri dönüş: BUNNY_STORAGE_MODE=local yaparak saniyeler içinde eski sisteme dön
  • Fallback mekanizması: BUNNY_FALLBACK_TO_LOCAL=true ile Bunny hatası otomatik local'e düşer
  • Aşamalı geçiş: Önce test kullanıcıları, sonra tüm sistem

Özet

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)

Onayınız Bekleniyor

Yukarıdaki plan uygun mu? Onaylarsanız TODO listesi oluşturup implementasyona başlayacağım.

Onay = Başla Değişiklik = Revize et İptal = Dur