Ana Player: resources/views/themes/muzibu/components/player.blade.php
Sidebar: resources/views/themes/muzibu/components/sidebar.blade.php
Audio Teknolojisi: HTML5 Audio API + Alpine.js
İkili Audio Öğesi: Crossfade için 2 element
Dinleme Kaydı: Otomatik (user_id, ip_address, user_agent, device_type)
Formatlar: MP3 (direkt) ve HLS (dönüştürülmüş)
Login: Email + Şifre
Register: Ad, Soyad, Email, Telefon (Tenant 1001), Şifre
Şifre Kriterleri: Min 8 karakter, Büyük harf, Küçük harf, Sayı
Tablo: subscription_plans
Fiyatlandırma: daily, weekly, monthly, quarterly, yearly
Özellikler: has_trial, device_limit, has_analytics, has_priority_support
Tablo: subscriptions
Durumlar: active, trial, expired, cancelled, paused, pending_payment
Metodlar: isActive(), isTrial(), daysRemaining(), cancel(), pause(), resume()
Tablo: muzibu_song_plays
Kayıtlar: song_id, user_id, ip_address, user_agent, device_type, created_at
getTopSongs($limit, $period) - En çok dinlenenler
getDeviceDistribution($period) - Cihaz dağılımı
getHourlyDistribution($date) - Saatlik dağılım
getUniqueListenersCount($period) - Toplam dinleyici
Artist → Album → Song ← Genre
Song ← SongPlay (dinleme kayıtları)
Playlist ↔ Song (M2M) dengan position
Playlist ↔ Sector, Radio (M2M)
HLS Streaming: Lazy conversion + MP3 fallback
Metadata: Duration, bitrate, sample_rate, channels
Encryption: is_encrypted, encryption_key fields
Media: Thumbmaker cover (media_id)
SEO: Schema.org MusicRecording
| Endpoint | Method | Auth | Açıklama |
|---|---|---|---|
| /songs/popular | GET | ❌ | En çok dinlenenler |
| /songs/recent | GET | ✅ | Son dinlenenler |
| /songs/{id}/stream | GET | ❌ | Stream URL |
| /songs/{id}/track-play | POST | ✅ | Dinleme kaydı |
| /playlists | GET | ❌ | Tüm playlistler |
| /albums/new-releases | GET | ❌ | Yeni çıkanlar |
Frontend: Session-based (Sanctum)
API: Sanctum token (stateless)
Admin: Session + Role-based
IP adresi kaydediliyor
User agent kaydediliyor
Device type tespit ediliyor
GDPR-uyumlu (minimal kişisel veri)
❌ Rate limiting (API'de yoksa)
❌ IP whitelist/blacklist
⚠️ Audio download koruması
Yöntem: Lazy conversion (isteğe bağlı)
Trigger: İlk stream isteğinde ConvertToHLSJob
Format: M3U8 playlist + TS segments
Fallback: MP3 olarak sunulur
file_path: Orijinal MP3
hls_path: HLS playlist.m3u8
hls_converted: Dönüştürüldü mü?
encryption_key: İsteğe bağlı şifreleme
Tüm modeller tenant connection'u otomatik kullanır
Central fallback: Default connection
Çoklu Dil: HasTranslations trait (JSON)
CSS: Tenant-specific Tailwind CSS
Build: npm run css:all veya css:muzibu
Modules/Muzibu/app/Models/Song.php
Modules/Muzibu/app/Models/SongPlay.php
Modules/Subscription/app/Models/Subscription.php
Modules/Muzibu/app/Http/Controllers/Api/SongController.php
Modules/Muzibu/app/Http/Controllers/Api/SongStreamController.php
Modules/Muzibu/routes/api.php
resources/views/themes/muzibu/components/player.blade.php