Muzibu Mobil Uygulama Analizi

Kapsamlı Teknik Doküman & Geliştirme Planı

Offline + DRM
17 Mart 2026
v4.0

v4 Yeni Özellikler

Offline İndirme
Şifreli dosya indirme
DRM Koruması
Kopyalanamaz format
Real-time Premium
Anlık abonelik kontrolü
Sistem Analizi
Backend detayları

Yönetici Özeti

30.000+
Şarkı
125.000+
Playlist
10-15
Saat/Gün
B2B
İş Modeli

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'ü

Tek codebase, iki platform
Native performans
Güçlü audio kütüphaneleri

1. Hedef & Vizyon

Tipik Kullanıcı Senaryosu

08:00
Kafe açılıyor
Uygulama açılır, müzik başlar
08:00-22:00
Gün boyu
Kesintisiz müzik çalar
22:00
Kafe kapanıyor
Uygulama kapatılır

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

15 saat
Kesintisiz çalışma
<50 MB
RAM kullanımı
0 crash
Günlük çökme

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ı
3/10
React Native

Audio için yetersiz, memory sorunları olabilir

9/10
Flutter

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.

Hızlı: 320 kbps
Normal: 128 kbps
Yavaş: 64 kbps
Çok yavaş: 32 kbps

Fallback Zinciri

HLS başarısız olursa sırayla yedek planlara geçer. Hiçbir durumda sessiz kalmaz.

1
HLS Adaptive Otomatik kalite ayarlı
2
HLS Sabit 128k Adaptive başarısızsa
3
MP3 128k HLS tamamen başarısızsa
4
MP3 64k Düşük kaliteli yedek
5
Sonraki Şarkıya Geç Bu şarkı çalınamıyorsa atla

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
└─────────────────────────┘
User-Specific Key
Her kullanıcı için farklı şifreleme
Custom Uzantı
.mzb uzantısı - sistem tanımıyor
Expiry Check
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

1
AES-256 Şifreleme
Askeri düzey algoritma
2
User-Specific Key
user_id + app_key hash
3
Device Binding
Cihaz kimliği eklenir
4
Secure Storage
Key'ler Keychain/Keystore'da

7. Real-time Premium Kontrolü

YENİ

Basit Anlatım

Sorun: Premium biten kullanıcı hâlâ müzik dinleyebilir mi?

Çözüm: Her şarkı değiştiğinde sistem abonelik durumunu kontrol edecek:

  • Şarkı bitip yenisi başlarken anlık kontrol
  • Premium bittiyse kibar uyarı göster
  • Premium başladıysa anında aktif et

Backend Endpoint

// GET /api/user/subscription-status
public function subscriptionStatus()
{
    $user = auth()->user();
    $expiresAt = DB::table('users')
        ->where('id', $user->id)
        ->value('subscription_expires_at');

    return response()->json([
        'is_premium' => $expiresAt &&
            Carbon::parse($expiresAt)->isFuture(),
        'expires_at' => $expiresAt,
        'server_time' => now()->toIso8601String(),
    ]);
}

Flutter Kontrolü

Future<bool> canPlayNext() async {
  // Online: API kontrol
  if (await _connectivity.isOnline) {
    final status = await _api
        .getSubscriptionStatus();
    _localDb.updateSubscription(status);
    return status.isPremium;
  }
  // Offline: Local kontrol
  final exp = await _localDb
      .getSubscriptionExpiry();
  return exp?.isAfter(DateTime.now())
      ?? false;
}

8. Social Login

Google

google_sign_in

  • Android'de native
  • iOS'ta da çalışır
  • Firebase ile entegre

Facebook

flutter_facebook_auth

  • Geniş kullanıcı kitlesi
  • Graph API erişimi
  • Profil fotoğrafı

Apple

sign_in_with_apple

  • iOS'ta zorunlu
  • Gizlilik odaklı
  • Email hide özelliği

Backend API Gereksinimi

POST /api/auth/social
{ "provider": "google|facebook|apple", "id_token": "eyJhbG..." }

9. Ödeme Sistemi (In-App Purchase)

Google Play Billing

Android için

Komisyon%15 (ilk $1M) / %30
AbonelikAylık, Yıllık
Paketin_app_purchase

App Store Connect

iOS için

Komisyon%15 (küçük işletme) / %30
AbonelikAylık, Yıllık
Paketin_app_purchase

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/loginE-posta/şifre
POST/api/auth/socialSocial login
GET/api/auth/meKullanıcı bilgisi
GET/api/user/subscription-statusAnlık premium durumu (YENİ)
Streaming & Download
GET/api/muzibu/songs/{id}/streamStream 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/initialBaşlangıç şarkı listesi
POST/api/muzibu/queue/refillDaha fazla şarkı
GET/api/muzibu/playlistsPlaylist listesi
GET/api/muzibu/genresTü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

Primary
#f97316 → #dc2626
Background
#121212
Surface
#1e1e1e
Text
#ffffff

Ekranlar

Login
Home
Now Playing
Downloads (YENİ)

13. Geliştirme Yol Haritası (7 Faz)

1

Faz 1: Temel Altyapı

Flutter proje, tema, Dio HTTP client, email/şifre login, GoRouter

2

Faz 2: Audio Player (Kalp) EN KRİTİK

just_audio + audio_service, HLS streaming, gapless, background playback

3

Faz 3: İçerik & Keşif

Home, search, playlist detay, favoriler, queue UI

4

Faz 4: Offline + DRM YENİ

Şarkı indirme, AES-256 şifreleme, .mzb formatı, offline playback, SQLite

5

Faz 5: Premium + Auth YENİ

Real-time premium kontrolü, social login (Google/FB/Apple), push notifications

6

Faz 6: In-App Purchase YENİ

Google Play Billing, App Store, webhook endpoints, receipt validation

7

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.

Flutter 3.x
Offline
DRM
In-App Purchase