v4 Yeni Özellikler
Yönetici Özeti
Ne Yapıyoruz?
Muzibu, işletmelere (kafe, restoran, otel, ofis) kesintisiz arka plan müziği sunan bir B2B platformudur. Kullanıcılar sabah uygulamayı açar, müziği başlatır ve gün boyu (10-15 saat) hiç dokunmadan çalmasını bekler.
Mobil uygulama, web sitesiyle aynı deneyimi sunmalı: Sabah aç, akşama kadar donmadan çalsın.
Teknoloji Seçimi: Flutter
Google'ın cross-platform framework'ü
1. Hedef & Vizyon
Tipik Kullanıcı Senaryosu
Hedef Kullanıcı Profili
Cihaz Durumu
- • 5-7 yıllık eski iPad/Android tablet
- • 2-3 GB RAM (düşük bellek)
- • Genellikle prize takılı
İnternet Durumu
- • Yavaş veya düzensiz bağlantı
- • WiFi kesintileri olabilir
- • Bazen 3G/4G'ye düşer
Kullanıcı Profili
- • Teknik bilgisi düşük
- • "Tek tıkla çalsın" beklentisi
- • Sorun çözme kapasitesi sınırlı
Kritik Beklenti
- • ASLA donmamalı
- • ASLA sessiz kalmamalı
- • ASLA çökmemeli
Başarı Kriterleri
2. Neden Flutter?
Basit Anlatım
Flutter, Google'ın geliştirdiği bir framework. Tek kod yazarak hem iPhone hem Android için uygulama çıkarabiliyoruz. React Native'e göre daha hızlı çalışıyor çünkü kod doğrudan makine diline derleniyor (JavaScript köprüsü yok).
Detaylı Karşılaştırma
| Kriter | React Native | Flutter | Neden Önemli? |
|---|---|---|---|
| Audio Kütüphaneleri | react-native-track-player | just_audio + audio_service ✓ | Flutter'ın audio sistemi daha olgun ve HLS desteği native |
| Gapless Playback | Sınırlı ⚠ | Native destek ✓ | Şarkılar arası boşluk kullanıcıyı rahatsız eder |
| Background Playback | Extra setup gerekli | audio_service isolate ✓ | Uygulama arka planda müzik çalmalı |
| Performans | JS Bridge overhead | Native ARM compile ✓ | 15 saat çalışacak, her ms önemli |
| Memory Management | GC tahmin edilemez ⚠ | Dart VM optimize ✓ | Memory leak = 15 saatte çökme |
| Build Size | ~20 MB | ~12 MB ✓ | Eski cihazlarda depolama sınırlı |
Audio için yetersiz, memory sorunları olabilir
Audio mükemmel, performans yüksek, memory stabil
3. Mevcut Sistem Analizi
YENİBasit Anlatım
Muzibu şu an şöyle çalışıyor:
- Şarkılar sunucuda - Kullanıcı dinlerken anlık olarak sunucudan çekiyor
- İndirme yok - Şarkı dosyasını telefona kaydetme özelliği mevcut değil
- HLS şifrelemesi var - Şarkılar parçalara bölünüp şifreleniyor (AES-128)
- Premium kontrolü - Kullanıcının üyelik bitiş tarihi kontrol ediliyor
Dosya Saklama Yapısı
/storage/tenant1001/app/public/muzibu/ ├── songs/ # MP3 dosyaları │ ├── mp3_128/ # 128kbps encode │ ├── mp3_64/ # 64kbps encode │ └── SONG_*.mp3 # Orijinal dosyalar ├── hls/ # HLS streaming │ └── {songId}/ │ ├── master.m3u8 # Ana playlist │ ├── ultralow/ # 32kbps │ ├── low/ # 64kbps │ ├── mid/ # 128kbps │ ├── high/ # Orijinal │ └── enc.bin # AES-128 key
Mevcut Premium Kontrolü
// User Model - isPremium()
public function isPremium(): bool {
// 5 dakika Redis cache
return Cache::remember("premium:{$this->id}", 300, function () {
return $this->subscription_expires_at?->isFuture() ?? false;
});
}
Sorun: 5 dakika cache = Premium bitince 5 dakika daha dinleyebilir
Mevcut Streaming Endpoints
| Endpoint | Amaç | Koruma |
|---|---|---|
| /api/muzibu/songs/{id}/stream | Stream URL al | Auth + Premium |
| /hls/muzibu/songs/{id}/master.m3u8 | HLS playlist | Signed URL |
| /hls-key/muzibu/songs/{id} | Şifre anahtarı | Signed Token |
| /api/.../download | İndirme | YOK! |
4. Kesintisiz Müzik Sistemi
Basit Anlatım
Müziğin donmaması için 3 temel strateji uyguluyoruz: (1) İnternet hızına göre otomatik kalite ayarı (HLS), (2) Şarkı bitmeden sonrakini arka planda yükleme (preload), (3) İnternet kesilirse bile çalmaya devam (buffer).
HLS Adaptive Streaming
HLS (HTTP Live Streaming), internet hızına göre otomatik kalite ayarı yapar. Bağlantı yavaşlarsa kaliteyi düşürür ama asla durmaz.
Fallback Zinciri
HLS başarısız olursa sırayla yedek planlara geçer. Hiçbir durumda sessiz kalmaz.
Gapless Playback
Şarkılar arası boşluk yok. Sonraki şarkı önceden yüklenir.
Aggressive Buffer
30 saniyelik buffer. İnternet 30 sn kesilse bile çalmaya devam.
Auto Recovery
Bağlantı gelince otomatik devam. Manuel müdahale gerekmez.
5. Offline İndirme Sistemi
YENİBasit Anlatım
- Kullanıcı beğendiği şarkıyı "İndir" butonuyla telefonuna kaydedecek
- İnternet olmadan bile indirdiği şarkıları dinleyebilecek
- İndirilen dosyalar şifreli olacak - başka uygulamalar açamaz
- Premium bitince indirilen şarkılar kilitlenecek
Yeni Backend Endpoint
// POST /api/muzibu/songs/{id}/download-token
public function downloadToken(int $songId): JsonResponse
{
$user = auth()->user();
if (!$user->isPremium()) {
return response()->json(['status' => 'subscription_required'], 402);
}
// User-specific encryption key
$userKey = hash('sha256', $user->id . config('app.key') . $songId);
// Download kaydı oluştur
UserDownload::create([
'user_id' => $user->id,
'song_id' => $songId,
'subscription_expires_at' => $user->subscription_expires_at
]);
return response()->json([
'status' => 'ready',
'download_url' => "/api/muzibu/songs/{$songId}/download?token={$token}",
'user_key' => $userKey,
'expires_at' => $user->subscription_expires_at
]);
}
.mzb Dosya Formatı
┌─────────────────────────┐ │ Magic Bytes (4 byte) │ "MZB\x01" ├─────────────────────────┤ │ Header (JSON, encrypted)│ │ - user_id │ │ - song_id │ │ - subscription_expires │ ├─────────────────────────┤ │ IV (16 byte) │ AES-256 IV ├─────────────────────────┤ │ Encrypted Audio Data │ AES-256-CBC └─────────────────────────┘
Her kullanıcı için farklı şifreleme
.mzb uzantısı - sistem tanımıyor
Abonelik tarihi dosya içinde
6. DRM / Kopyalama Koruması
YENİBasit Anlatım
Neden önemli?
Kullanıcı şarkıyı indirip USB ile PC'ye kopyalarsa, abonelik bitse bile dinlemeye devam edebilir. Bunu engellemek için:
- Dosyalar şifreli - Sadece bizim uygulama açabilir
- Her kullanıcı farklı anahtar - Başkası açamaz
- Dosya PC'ye kopyalansa bile çalışmaz
DRM Seçenekleri
| Yöntem | Güvenlik | Zorluk | Maliyet | Öneri |
|---|---|---|---|---|
| Widevine + FairPlay | Çok Yüksek | Zor | $$$ | |
| Custom Encryption (AES-256) | Yüksek | Kolay | $ | ÖNERİLEN |
4 Katmanlı Koruma
9. Ödeme Sistemi (In-App Purchase)
Google Play Billing
Android için
App Store Connect
iOS için
Backend Webhook Gereksinimleri
Google Play
- • Real-time Developer Notifications
- • POST /api/webhooks/google-play
App Store
- • Server-to-Server Notifications V2
- • POST /api/webhooks/app-store
10. API Entegrasyon
Authentication
| POST | /api/auth/login | E-posta/şifre |
| POST | /api/auth/social | Social login |
| GET | /api/auth/me | Kullanıcı bilgisi |
| GET | /api/user/subscription-status | Anlık premium durumu (YENİ) |
Streaming & Download
| GET | /api/muzibu/songs/{id}/stream | Stream URL |
| POST | /api/muzibu/songs/{id}/download-token | İndirme token (YENİ) |
| GET | /api/muzibu/songs/{id}/download | Şifreli dosya indir (YENİ) |
| POST | /api/muzibu/songs/{id}/track-start | Çalma başladı |
Content
| GET | /api/muzibu/queue/initial | Başlangıç şarkı listesi |
| POST | /api/muzibu/queue/refill | Daha fazla şarkı |
| GET | /api/muzibu/playlists | Playlist listesi |
| GET | /api/muzibu/genres | Tür listesi |
11. Uygulama Mimarisi
┌────────────────────────────────────────────────────────────────┐ │ FLUTTER APP │ ├────────────────────────────────────────────────────────────────┤ │ ┌──────────────────────────────────────────────────────┐ │ │ │ UI LAYER │ │ │ │ Login │ Home │ Player │ Library │ Downloads (YENİ) │ │ │ └──────────────────────────────────────────────────────┘ │ │ ┌──────────────────────────────────────────────────────┐ │ │ │ STATE MANAGEMENT (Riverpod) │ │ │ │ AuthState │ PlayerState │ ContentState │ DownloadState│ │ │ └──────────────────────────────────────────────────────┘ │ │ ┌──────────────────────────────────────────────────────┐ │ │ │ SERVICE LAYER │ │ │ │ Auth │ Music │ Payment │ Download │ Crypto (YENİ) │ │ │ └──────────────────────────────────────────────────────┘ │ │ ┌──────────────────────────────────────────────────────┐ │ │ │ REPOSITORY LAYER │ │ │ │ Remote (API) │ Local (SQLite) │ Cache │ Encrypted │ │ │ └──────────────────────────────────────────────────────┘ │ ├────────────────────────────────────────────────────────────────┤ │ AUDIO SERVICE (Background Isolate) │ │ just_audio + audio_service + offline playback (YENİ) │ └────────────────────────────────────────────────────────────────┘
lib/ ├── features/ │ ├── auth/ # Login, Social Login │ ├── home/ # Ana sayfa │ ├── player/ # Audio player │ ├── playlists/ # Playlist yönetimi │ ├── downloads/ # Offline indirmeler (YENİ) │ ├── subscription/ # Abonelik & IAP │ └── settings/ # Ayarlar ├── services/ │ ├── audio_handler.dart │ ├── download_service.dart (YENİ) │ ├── crypto_service.dart (YENİ) │ └── payment_service.dart
12. Tasarım Sistemi
Renk Paleti
Ekranlar
13. Geliştirme Yol Haritası (7 Faz)
Faz 1: Temel Altyapı
Flutter proje, tema, Dio HTTP client, email/şifre login, GoRouter
Faz 2: Audio Player (Kalp) EN KRİTİK
just_audio + audio_service, HLS streaming, gapless, background playback
Faz 3: İçerik & Keşif
Home, search, playlist detay, favoriler, queue UI
Faz 4: Offline + DRM YENİ
Şarkı indirme, AES-256 şifreleme, .mzb formatı, offline playback, SQLite
Faz 5: Premium + Auth YENİ
Real-time premium kontrolü, social login (Google/FB/Apple), push notifications
Faz 6: In-App Purchase YENİ
Google Play Billing, App Store, webhook endpoints, receipt validation
Faz 7: Test & Release
15 saat oturum testi, memory leak analizi, eski cihaz testleri, store yayını
14. Flutter Paketleri
# pubspec.yaml # Audio just_audio: ^0.9.36 audio_service: ^0.18.12 audio_session: ^0.1.18 # Network & Storage dio: ^5.4.0 flutter_secure_storage: ^9.0.0 sqflite: ^2.3.0 path_provider: ^2.1.1 # Encryption (YENİ) encrypt: ^5.0.3 crypto: ^3.0.3 # Auth google_sign_in: ^6.2.1 flutter_facebook_auth: ^6.1.1 sign_in_with_apple: ^5.0.0 # Payments in_app_purchase: ^3.1.13 purchases_flutter: ^6.17.0 # UI & Navigation go_router: ^13.0.0 flutter_riverpod: ^2.4.9 cached_network_image: ^3.3.1
15. Riskler & Çözümler
Memory Leak (15 saat)
Çözüm: Playlist limiti, buffer cleanup, isolate
Zayıf İnternet
Çözüm: HLS adaptive, 30sn buffer, fallback chain, offline cache
Premium Gecikmesi
Çözüm: Webhook + push notification + polling fallback
Dosya Kopyalama (YENİ)
Çözüm: AES-256 + user key + device binding + custom format (.mzb)
Sonuç
Muzibu mobil uygulaması, Flutter ile geliştirilecek. Kesintisiz müzik için HLS adaptive streaming, gapless playback ve aggressive buffer kullanılacak. Offline indirme + DRM koruması + real-time premium kontrolü ile tam güvenli sistem.
8. Social Login
Google
google_sign_in
Facebook
flutter_facebook_auth
Apple
sign_in_with_apple
Backend API Gereksinimi
POST /api/auth/social { "provider": "google|facebook|apple", "id_token": "eyJhbG..." }