Mevcut Platform Durumu
Basit Anlatim (Herkes Icin)
Muzibu su anda bir web tarayicisi uzerinden calisan muzik platformu. Kullanicilar sarkiları dinleyebiliyor,
playlist olusturabiliyor, favori ekleyebiliyor. Sistem HLS denilen bir teknolojiyle (Netflix/Spotify'in da kullandigi)
sarkiları farkli kalitelerde sunuyor. Zayif internet baglantisinda dusuk kalite, guclu baglantida yuksek kalite otomatik seciliyor.
Mobil uygulama icin altyapinin %80'i hazir. API'ler (uygulamanin sunucuyla konustugu noktalar) buyuk olcude mevcut.
Eksik olan kisimlar: sosyal giris (Google/Apple ile giris), offline dinleme altyapisi, push bildirimler ve
uygulama icin ozel bazi endpoint'ler.
Teknik Detaylar
Backend Stack
Frontend Stack (Mevcut Web)
Temel Veritabani Modelleri
| Model | Tablo | PK | Onemli Alanlar | Iliskiler |
|---|---|---|---|---|
| Song | muzibu_songs | song_id | title(JSON), duration, hls_path, encryption_key, play_count, color_hash | Album, Genre, Playlists(M2M), SongPlays |
| Album | muzibu_albums | album_id | title(JSON), songs_count, total_duration | Artist, Songs(hasMany) |
| Artist | muzibu_artists | artist_id | title(JSON), bio(JSON), albums_count, songs_count | Albums(hasMany), Songs(through) |
| Playlist | muzibu_playlists | playlist_id | title(JSON), is_system, is_public, songs_count | User, Songs(M2M), Sectors, Radios |
| SongPlay | muzibu_song_plays | id | listened_duration, was_skipped, stop_reason, source_type | Song, User, DeviceProfile |
| Genre | muzibu_genres | genre_id | title(JSON), songs_count | Songs(hasMany) |
| Favorite | favorites | id | favoritable_type, favoritable_id (polymorphic) | User + any model |
| DeviceProfile | muzibu_device_profiles | device_profile_id | fingerprint, device_memory, cpu_cores, device_score | User, SongPlays |
| Subscription | subscriptions | id | status, current_period_start/end, auto_renew, has_trial | User, Plan |
HLS Streaming Mimarisi
Kalite Seviyeleri
Guvenlik Katmanlari
API Analizi: Mevcut & Eksik
Basit Anlatim (Herkes Icin)
API, mobil uygulamanin sunucuyla konustugu "kapılar" gibi dusunulebilir. Ornegin "sarkılari getir" dediginde bir kapi acilir ve sarkılar gelir. Muzibu'da 200'den fazla kapi zaten acik. Sarki dinleme, playlist yonetimi, favori ekleme, arama gibi temel islevler hazir. Ancak mobil uygulama icin ~15 yeni kapi acilmasi gerekiyor: Google/Apple ile giris, offline indirme izinleri, push bildirim kaydi gibi.
Mevcut API Endpointleri (Kullanima Hazir)
Kimlik Dogrulama (Auth) — 12 Endpoint
| Metot | Endpoint | Auth | Aciklama |
|---|---|---|---|
| POST | /api/auth/login | — | Email/sifre ile giris |
| POST | /api/auth/register | — | Yeni kullanici kaydi |
| POST | /api/auth/check-email | — | Email mevcut mu kontrol |
| GET | /api/auth/me | Sanctum | Aktif kullanici bilgisi |
| POST | /api/auth/logout | Sanctum | Cikis (token iptal) |
| POST | /api/auth/forgot-password | — | Sifre sifirlama istegi |
| POST | /api/auth/reset-password | — | Yeni sifre kaydetme |
| GET | /api/v1/profile | Sanctum | Profil bilgileri |
| PUT | /api/v1/profile | Sanctum | Profil guncelle |
| POST | /api/v1/tokens/refresh | Sanctum | Token yenileme |
| GET | /api/v1/tokens/validate | Sanctum | Token gecerlilik kontrolu |
| DEL | /api/v1/tokens | Sanctum | Tum tokenlari iptal et |
Muzik & Streaming — 25+ Endpoint
| Metot | Endpoint | Auth | Aciklama |
|---|---|---|---|
| GET | /api/muzibu/songs/{id} | — | Sarki detayi |
| GET | /api/muzibu/songs/recent | Sanctum | Son dinlenenler |
| GET | /api/muzibu/songs/popular | — | Populer sarkilar |
| GET | /api/muzibu/songs/{id}/stream | Web | Signed HLS/MP3 URL al (Premium) |
| GET | /hls/muzibu/songs/{id}/{file} | Signed | HLS playlist & segment serve |
| GET | /hls-key/muzibu/songs/{id} | Signed | AES-128 sifreleme anahtari |
| POST | /api/muzibu/songs/{id}/track-start | Sanctum | Dinleme baslat |
| POST | /api/muzibu/songs/{id}/track-hit | Sanctum | 30sn dinleme sayaci |
| POST | /api/muzibu/songs/{id}/track-end | Sanctum | Dinleme bitir/atla |
| GET | /api/muzibu/albums/{id} | — | Album + sarkilari |
| GET | /api/muzibu/albums/new-releases | — | Yeni cikanlar |
| GET | /api/muzibu/artists/{id} | — | Sanatci profili |
| GET | /api/muzibu/genres/{id}/songs | — | Tur sarkilari (shuffle) |
| POST | /api/muzibu/queue/refill | — | Akilli kuyruk yenileme |
| GET | /api/muzibu/search | — | Meilisearch full-text arama |
Playlist & Favori — 15+ Endpoint
| Metot | Endpoint | Aciklama |
|---|---|---|
| GET | /api/muzibu/playlists/my-playlists | Kullanicinin playlistleri |
| POST | /api/muzibu/playlists/quick-create | Hizli playlist olustur |
| POST | /api/muzibu/playlists/{id}/add-song | Playliste sarki ekle |
| PUT | /api/muzibu/playlists/{id}/reorder | Sarki sirasini degistir |
| DEL | /api/muzibu/playlists/{id} | Playlist sil |
| POST | /api/favorites/toggle | Favori ekle/kaldir |
| GET | /api/favorites/list | Favori listesi |
| GET | /api/favorites/check | Favori kontrolu |
| POST | /api/muzibu/{type}/{id}/rate | Puanlama (1-5 yildiz) |
Cihaz Profili & Analitik — 8 Endpoint
| Metot | Endpoint | Aciklama |
|---|---|---|
| POST | /api/muzibu/device-profile | Cihaz bilgisi kaydet |
| GET | /api/muzibu/device-profiles | Kullanicinin cihazlari |
| POST | /api/muzibu/speed-test | Hiz testi sonucu kaydet |
| GET | /api/muzibu/ping | Gecikme testi |
| POST | /api/muzibu/debug-log | Player hata raporlama |
Eksik API Endpointleri (Gelistirilmesi Gereken)
Kritik Oncelik
/api/auth/social/{provider}
Google & Apple ile giris. Mobil uygulamada sosyal giris standart beklenti.
/api/v1/subscription/status
Abonelik durumu, kalan gun, plan bilgisi. In-app purchase entegrasyonu icin gerekli.
/api/muzibu/songs/{id}/download-token
Offline indirme tokeni. Sarki indirme hakki kontrolu + sureli token uretimi.
/api/v1/devices/register
Push notification icin FCM/APNs token kaydi.
Orta Oncelik
/api/v1/listening-history
Detayli dinleme gecmisi (gunluk/haftalik/aylik filtreleme).
/api/v1/stats/summary
Kullanici istatistik ozeti: toplam dinleme, en cok dinlenen, skip orani.
/api/v1/profile/audio-preference
Ses kalitesi tercihi degistirme (auto, mp3_128, hls_auto, vb.).
/api/v1/home/feed
Ana sayfa icerigi: onerileri, yeni cikanlar, populer, kisisel oneriler tek istekte.
Dusuk Oncelik (Sonra Eklenebilir)
POST /api/v1/share/{type}/{id}
Deeplink paylasim URL'i uretme
GET /api/v1/recommendations
Kisisel oneri motoru
POST /api/v1/report/bug
Uygulama icinden hata bildirimi
GET /api/v1/app/config
Uygulama ayarlari (minimum versiyon, bakim modu)
GET /api/v1/lyrics/{songId}
Sarki sozu (ayri endpoint, buyuk payload onleme)
DELETE /api/v1/account
Hesap silme (App Store zorunlu)
Teknoloji Secimi & Karsilastirma
Basit Anlatim (Herkes Icin)
Mobil uygulama gelistirmede uc temel yol var: Native (her platform icin ayrı kod - en performanslı ama en pahalı),
React Native (tek kod hem Android hem iOS - iyi performans, buyuk topluluk), ve
Flutter (Google'in teknolojisi - cok iyi performans ama daha kucuk topluluk).
Muzik uygulamasi icin React Native + Expo onerimiz. Sebebi: Spotify, SoundCloud gibi buyuk muzik uygulamalarinin da
benimsedigi bir yaklasim, arka plan muzik calma (background audio) konusunda olgun kutuphane destegi var, ve
tek codebase ile hem Android hem iOS'a hizli cikis yapilabilir. Flutter da iyi bir secim olurdu ama
audio kutuphaneleri RN kadar olgun degil.
Teknoloji Karsilastirmasi
| Kriter |
React Native + Expo
ONERILEN
|
Flutter
|
Native (Swift + Kotlin)
|
|---|---|---|---|
| Arka Plan Muzik | react-native-track-player (olgun) | just_audio + audio_service | Native API (en iyi) |
| HLS Streaming | iOS: AVPlayer native Android: ExoPlayer | Platform native bridge | AVPlayer / ExoPlayer |
| Offline Indirme | rn-fetch-blob / expo-file-system | dart:io + path_provider | URLSession / DownloadManager |
| Performans | Iyi (JSI bridge) | Cok iyi (AOT compile) | En iyi |
| Gelistirme Hizi | Hizli (hot reload + npm) | Hizli (hot reload) | Yavas (2x codebase) |
| Topluluk & Destek | Cok buyuk (Meta destekli) | Buyuyen (Google destekli) | Resmi dokumantasyon |
| Maliyet | 1x (tek takim) | 1x (tek takim) | 2x (iki takim) |
| Push Notification | expo-notifications | firebase_messaging | FCM / APNs native |
| In-App Purchase | react-native-iap | in_app_purchase | StoreKit / BillingClient |
| Toplam Skor | 9/10 | 8/10 | 7/10 |
Onerilen Teknoloji Yigini (Tech Stack)
Framework
Audio & Player
State & Data
UI & Navigasyon
Offline & Sync
Auth & Guvenlik
Uygulama Mimarisi
Basit Anlatim
Uygulama, alt kisimda 5 ana sekme olacak: Ana Sayfa (oneriler, yeni cikanlar), Kesfet (turler, sanatcilar, radyolar), Arama, Kutuphanem (favoriler, playlistler, indirilenler) ve Profil. Alt kisimda her zaman gorunen bir mini player olacak, tukladiginda tam ekran player acilacak. Web sitesindeki gibi, bir sayfadan digerine gecerken muzik kesilmeyecek (SPA davranisi).
Ekran Haritasi & Navigasyon
Muzibu Mobile App — Ekran Haritasi ==================================== Tab Navigator (Alt Menu) ├── Home Tab │ ├── HomeScreen — Onerileri, yeni cikanlar, populerler │ ├── AlbumDetailScreen — Album detay + sarki listesi │ ├── ArtistDetailScreen — Sanatci profili + albumler + sarkilar │ ├── PlaylistDetailScreen — Playlist detay + sarki listesi │ └── GenreDetailScreen — Tur sarkilari │ ├── Discover Tab │ ├── DiscoverScreen — Turler, sanatcilar, radyolar, sektorler │ ├── GenreListScreen — Tum turler │ ├── ArtistListScreen — Tum sanatcilar │ ├── RadioListScreen — Radyo istasyonlari │ └── SectorDetailScreen — Sektor playlistleri │ ├── Search Tab │ └── SearchScreen — Anlık arama (Meilisearch) │ ├── SearchResultsScreen — Filtreli sonuclar │ └── [Detail Screens] — Sarki/Album/Artist/Playlist detay │ ├── Library Tab │ ├── LibraryScreen — Favoriler, Playlistler, Indirilenler │ ├── FavoritesScreen — Favori sarkilar/albumler │ ├── MyPlaylistsScreen — Kullanici playlistleri │ ├── PlaylistEditScreen — Playlist duzenle (drag-drop) │ ├── DownloadsScreen — Offline indirilenler │ └── ListeningHistoryScreen — Dinleme gecmisi │ └── Profile Tab ├── ProfileScreen — Profil bilgileri, ayarlar ├── SettingsScreen — Ses kalitesi, bildirimler, depolama ├── SubscriptionScreen — Abonelik planlari, odeme ├── DevicesScreen — Bagli cihazlar └── AboutScreen — Hakkinda, lisanslar Modal / Overlay Screens ├── FullPlayerScreen — Tam ekran player (swipe up) │ ├── Queue Tab — Siradaki sarkilar │ ├── Lyrics Tab — Sarki sozu │ └── Related Tab — Benzer sarkilar ├── AddToPlaylistModal — Playliste ekle (bottom sheet) ├── LoginModal — Giris ekrani (modal) ├── QualityPickerModal — Ses kalitesi secimi └── SleepTimerModal — Uyku zamanlayicisi
Player Mimarisi (Cekirdek)
Player Katmanlari ================== 1. Transport Layer (react-native-track-player) ├── iOS: AVPlayer (native HLS destegi) ├── Android: ExoPlayer (native HLS + DASH) ├── Background playback (uygulama kapali) ├── Lock screen kontrolleri ├── Notification controls (Android) ├── Control Center (iOS) └── Bluetooth / AirPlay / CarPlay 2. Player Service (Headless JS) ├── playbackService.ts — Arka plan event handler ├── Oynatma olaylari: │ ├── Event.RemotePlay — Dis cihaz "cal" │ ├── Event.RemotePause — Dis cihaz "duraklat" │ ├── Event.RemoteNext — Sonraki sarki │ ├── Event.RemotePrevious — Onceki sarki │ ├── Event.RemoteSeek — Surukle │ └── Event.PlaybackError — Hata yonetimi └── Track metadata (baslik, sanatci, kapak) 3. Queue Manager (Zustand Store) ├── currentQueue: Track[] — Siradaki sarkilar ├── currentIndex: number — Aktif sarki indexi ├── shuffleMode: boolean — Karistirma ├── repeatMode: off|one|all — Tekrar modu ├── contextType: string — Kaynak (album, playlist, genre...) ├── contextId: number — Kaynak ID'si └── autoRefill() — Kuyruk bitince otomatik yenile (API) 4. Stream Resolver ├── getStreamUrl(songId) — API'den signed URL al ├── Format secimi: │ ├── WiFi: HLS auto (4 seviye) │ ├── 4G: HLS soft (3 seviye) │ ├── 3G: MP3 128k │ └── 2G: MP3 64k ├── Token yenileme (expire) └── Offline fallback (SQLite) 5. Analytics Tracker ├── trackStart(songId) — Dinleme basla ├── trackHit(songId) — 30sn dinleme (play_count++) ├── trackEnd(songId, data) — Dinleme bitir └── Batch send (offline kuyruk)
State Yonetimi
Zustand Stores
usePlayerStore — isPlaying, volume, currentSong, queueuseAuthStore — user, token, isPremium, isLoggedInuseFavoriteStore — favoriteSongIds, favoriteAlbumIdsuseDownloadStore — downloads, progress, offline songsuseSettingsStore — audioQuality, theme, notificationsTanStack Query (Server State)
useHomeFeed() — staleTime: 5dkuseAlbum(id) — staleTime: 24saatusePlaylist(id) — staleTime: 1saatuseSearchResults(q) — staleTime: 30snuseListeningHistory() — staleTime: 2dkOffline Dinleme Stratejisi
Basit Anlatim
Kullanicilar, WiFi'dayken sarkiları telefonlarına indirebilecek ve internetsiz ortamlarda (ucak, metro, daglık alan) muzik dinlemeye devam edebilecek. Premium uyelere ozel bir ozellik olacak. Indirilen sarkilar sifrelenmis olarak saklanacak, yani baska uygulamalarla paylasilamayacak. Abonelik sona erdiginde indirilen sarkilar artik calinamayacak (DRM benzeri koruma).
Offline Indirme Akisi
Offline Indirme Akisi ====================== AŞAMA 1: INDIRME ISTEGI User: "Bu albumu indir" butonuna basar ↓ App: Premium kontrolu (subscription_expires_at > now?) ├── Hayir → "Premium uyelik gerekli" modal goster └── Evet ↓ App: Download token al (POST /api/muzibu/songs/{id}/download-token) ↓ Response: { token, expires_at, format, quality } AŞAMA 2: DOSYA INDIRME For each song in album: ↓ 1. Stream URL al (signed, 60dk gecerli) 2. expo-file-system ile indir ├── WiFi: MP3 orijinal kalite (veya HLS mid 128k tek dosya) └── 4G: MP3 128k (veri tasarrufu) 3. Indirme ilerlemesi goster (%42 gibi) 4. AES-256 ile sifreleme (APP_KEY + user_id + song_id) 5. Sifrelenmis dosya → app sandbox'a kaydet iOS: Documents/offline/{songId}.enc Android: files/offline/{songId}.enc AŞAMA 3: METADATA KAYDI SQLite'a kaydet: ├── song_id, title, artist, album, duration ├── cover_url (lokal kopya) ├── file_path (sifrelenmis dosya yolu) ├── encryption_key_hash ├── downloaded_at, expires_at └── quality (mp3_128, mp3_original, vb.) AŞAMA 4: CALMA (OFFLINE) Kullanici sarkiyi calmak ister: ↓ 1. SQLite'dan metadata oku 2. Premium hala gecerli mi? (expires_at kontrolu) ├── Hayir → "Aboneliginiz sona erdi" uyarisi └── Evet ↓ 3. Sifrelenmis dosyayi oku 4. Bellek icinde coz (AES-256 decrypt) 5. Gecici dosya olustur (tmp/{random}.mp3) 6. react-native-track-player ile cal 7. Calma bitince gecici dosyayi sil AŞAMA 5: TEMIZLIK & SYNC Periyodik kontrol (her acilista + 24 saatte bir): ├── Abonelik kontrolu (API veya lokal cache) ├── Suresi dolmus indirmeler → Sil ├── Depolama alani kontrolu (uyarı >2GB) └── Online olunca: Dinleme istatistikleri sync
Offline Guvenlik (DRM-Lite)
Koruma Katmanlari
Depolama Yonetimi
Eksikler & Backend Gelistirmeleri
Auth & Guvenlik
Streaming & Offline
web middleware kullanıyor. Sanctum bearer token da desteklenmeli.Bildirimler & Entegrasyon
Gelistirme Yol Haritasi
Basit Anlatim
Uygulama gelistirmesini 4 faza boluyoruz. Ilk fazda temel muzik dinleme calısır hale gelir (sarki cal, playlist, favori). Ikinci fazda offline dinleme ve bildirimler eklenir. Ucuncu fazda sosyal ozellikler ve iyilestirmeler yapilir. Dorduncu faz ise polish (cilalanma) ve magazaya yayinlama asamasidir.
Faz 1: Temel Uygulama (MVP)
~6-8 HaftaFrontend (React Native)
Backend (Laravel)
Faz 2: Offline & Bildirimler
~4-6 HaftaFrontend
Backend
Faz 3: Sosyal & Premium
~4-6 HaftaOzellikler
Backend
Faz 4: Polish & Yayin
~3-4 HaftaSonuc & Oneri
Muzibu'nun mevcut altyapisi, mobil uygulama gelistirme icin guclu bir temel sunuyor. 200+ API endpoint'in buyuk cogunlugu dogrudan kullanilabilir durumda. React Native + Expo ile tek codebase'den hem Android hem iOS'a hizli cikis yapilabilir. En kritik backend degisikligi, stream endpoint'inin Sanctum token destegi ve offline indirme tokeni API'sidir. Tahmini toplam sure: 17-24 hafta (4 faz).