Muzibu - İşletmeler İçin Müzik Platformu
Muzibu, bireysel kullanıcılar için değil işletmeler için tasarlanmış profesyonel bir müzik platformudur. Kafeler, restoranlar, mağazalar, oteller ve ofisler gibi ticari mekanlar için kesintisiz arka plan müziği sağlar. Bu rapor, işletmenizde bir çalışan veya sistem müzik çalmaya başladığında arka planda gerçekleşen teknik süreçleri açıklar.
💡 İşletmeler için önemli olan: Şarkıya ilk tıklandığındaki ~1 saniyelik bekleme değil, sonrasındaki geçişlerde sorun yaşanmaması ve bekleme olmamasıdır. Bir kere başlatıldığında sistem otomatik devam eder, preload sayesinde şarkı geçişleri kesintisiz gerçekleşir.
Genel Bakış
İşletmenizde bir çalışan müzik çalmaya başladığında, arka planda 9 aşamalı bir süreç başlar. Abonelik ve yetki kontrolü yapılır, müzik dosyası güvenli şekilde hazırlanır, dinleme istatistikleri kaydedilir ve işletmenizde kesintisiz müzik deneyimi için sıradaki şarkılar otomatik hazırlanır. Redis cache kullanılarak yoğun saatlerde bile performans korunur.
Şarkı Çalma Akışı - 9 Aşama (Detaylı)
Yetki Kontrolü (Auth Check)
~50ms ZorunluKullanıcı giriş yapmış mı ve premium üyeliği var mı kontrol edilir. Yetkisiz kullanıcılar giriş veya üyelik sayfasına yönlendirilir.
Stream URL Alma
~150ms ZorunluSunucudan şarkının oynatma adresi istenir. Bu adres şifrelenmiş ve süreli olduğundan başkaları tarafından kopyalanıp kullanılamaz.
HLS Playlist İndirme
~80ms ZorunluHLS formatındaki playlist dosyası (m3u8) indirilir. Bu dosya şarkının parça listesini, şifreleme bilgilerini ve segment adreslerini içerir.
HLS Şifreleme Anahtarı (Key)
~40ms ZorunluŞarkı segmentlerini çözmek için gerekli AES-128 şifreleme anahtarı sunucudan alınır. Bu anahtar olmadan ses dosyaları dinlenemez.
İlk HLS Segment İndirme
~280ms ZorunluŞarkının ilk ses parçası (segment-000.ts) indirilir ve şifre çözülür. Bu segment tamamen yüklendiğinde müzik çalmaya başlar. En çok süre bu aşamada geçer.
Sıra Oluşturma (Queue Initial)
~150-300ms Her Tıklamadaİşletmede bir şarkıya her tıklandığında yeni bir sıra oluşturulur. Tıklanan şarkının context'ine göre (albüm, playlist, tür, radyo vb.) 15 şarkılık liste sunucudan çekilir.
- • Kullanıcı bir şarkıya tıkladığında
- • Farklı albümden şarkı seçildiğinde
- • Farklı playlist'ten şarkı seçildiğinde
- • Arama sonucundan şarkı seçildiğinde
- • Ana sayfadan popüler şarkı seçildiğinde
- • Şarkı otomatik bitip sıradaki başladığında
- • İleri (▶▶) butonuna basıldığında
- • Geri (◀◀) butonuna basıldığında
- • Sıra içinde gezinirken
- • Preload ile sonraki şarkı yüklenirken
| Context | Şarkı Kaynağı | Sıralama | Bitince |
|---|---|---|---|
| Albüm | Albümdeki şarkılar | Karışık | → Tür'e geç |
| Playlist | Playlist şarkıları | Karışık | → Tür'e geç |
| Kullanıcı Playlist | Kullanıcının listesi | Sıralı | → Tür'e geç |
| Tür (Genre) | Türdeki tüm şarkılar | Karışık | ♾️ Sonsuz döngü |
| Radyo | Radyo havuzu | Karışık | ♾️ Sonsuz döngü |
| Sektör | Sektör playlist'leri | Karışık | ♾️ Sonsuz döngü |
| Popüler | Top 100 şarkı | Karışık | → Tür'e geç |
| Favoriler | Kullanıcı favorileri | Ekleme sırası | → Tür'e geç |
| Arama | Şarkının albümü | Karışık | → Tür'e geç |
Kafe örneği: Çalışan sabah "Caz" türünden bir şarkıya tıklar → Queue oluşturulur (~200ms) → Gün boyu şarkılar otomatik geçer (queue korunur, ek süre yok) → Akşam müşteri "Pop" türünden şarkı isterse → Yeni tıklama = Yeni queue (~200ms).
Dinleme Kaydı (track-start)
~50ms Async/ParalelMüzik başladığında dinleme kaydı oluşturulur. Bu işlem arka planda çalışır ve müziğin başlamasını bekletmez. Cihaz, tarayıcı ve zaman bilgileri kaydedilir.
30 Saniye Sonra Hit Kaydı (track-hit)
~30ms 30sn SonraKullanıcı şarkıyı en az 30 saniye dinlerse "gerçek dinleme" sayılır ve şarkının play_count değeri 1 artar. Bu süre sahte dinlemeleri engellemek için standarttır.
Şarkı Bitişi + Sıra Yenileme
~100ms Şarkı BitinceŞarkı bittiğinde veya atlandığında dinleme süresi kaydedilir (track-end). Sırada az şarkı kaldıysa aynı tür/albümden yeni şarkılar otomatik eklenir (queue/refill).
Toplam Süre Dağılımı (Her Şarkı Tıklamasında)
Müzik Başlayana Kadar (Sıralı - Toplam ~800ms)
Paralel Çalışan (Müziği Bekletmez)
Şarkı Oynarken / Bitince
Aşama 1-6 sıralı çalışır. Her yeni şarkıya tıklamada bu süre geçer.
Preload sayesinde sonraki şarkı hazır. Sıra içi geçişlerde bekleme yok.
Cache Karşılaştırması
Biz Cache KullanıyoruzŞarkı bilgileri ve kullanıcı verileri Redis cache'de tutulur. Her istekte veritabanına gitmek yerine bellekten okunur.
| İşlem | Cache'siz (DB) | Cache'li (Redis) | Kazanç |
|---|---|---|---|
| Şarkı bilgisi alma | ~200ms | ~5ms | 40x fark |
| Premium kontrolü | ~50ms | ~2ms | 25x fark |
| Sıradaki şarkıları getirme | ~300ms | ~20ms | 15x fark |
| Genre/Playlist bilgisi | ~100ms | ~3ms | 33x fark |
| İLK ŞARKI BAŞLAMA | ~1500-2000ms | ~600-650ms | %65 fark |
| SONRAKİ ŞARKIYA GEÇİŞ | ~500ms | ~0ms (preload) | %100 |
Preload Sistemi
Aktifİlk Şarkı (Preload Yok)
- Stream URL istenir (~150ms)
- HLS playlist indirilir (~100ms)
- İlk segment yüklenir (~300ms)
- Müzik başlar
Sonraki Şarkılar (Preload Var)
- Şarkı çalarken sıradaki hazırlanır
- HLS instance oluşturulur
- İlk segmentler önbelleğe alınır
- Geçişte anında başlar
Bu İşlemler Kaldırılabilir mi?
Premium kontrolü, şifreli URL, HLS formatı, imzalı bağlantılar: Bunlar olmadan şarkılar kolayca indirilebilir, URL'ler paylaşılabilir ve premium sistemi çalışmaz.
track-start, track-hit, track-end: Kaldırılırsa ~100ms hız kazanılır ama hangi şarkının ne kadar dinlendiği, skip oranları, cihaz dağılımı ve telif hesaplamaları yapılamaz.
Redis cache, HLS preload, async istatistikler: Sistem zaten maksimum optimize. İlk tıklamada ~650ms, sonraki geçişlerde 0ms bekleme.
Toplanan Veriler ve Kullanım Alanları
Her Dinlemede Kaydedilen
Kullanım Alanları
Sistem Mimarisi
Veri Akış Şeması
┌──────────────────┐ ┌──────────────────┐ ┌──────────────────┐
│ TARAYICI │ │ SUNUCU │ │ VERİTABANI │
│ (Alpine.js) │ │ (Laravel) │ │ (MySQL) │
└────────┬─────────┘ └────────┬─────────┘ └────────┬─────────┘
│ │ │
│ 1. Şarkıya tıkla │ │
│ ─────────────────────────>│ │
│ │ │
│ │ 2. Redis cache? │
│ │ ─────────────────────────>│ (Redis)
│ │ <─────────────────────────│ ~5ms
│ │ │
│ 3. Şifreli URL │ │
│ <─────────────────────────│ │
│ ~150ms │ │
│ │ │
│ 4. HLS Playlist │ │
│ ─────────────────────────>│ (Nginx static) │
│ <─────────────────────────│ │
│ │ │
│ 5. HLS Segments │ │
│ ─────────────────────────>│ (AES-128 encrypted) │
│ <─────────────────────────│ │
│ ~400ms │ │
│ │ │
│ ♫ MÜZİK BAŞLAR ♫ │ │
│ │ │
│ 6. track-start (async) │ │
│ ─────────────────────────>│ INSERT song_plays │
│ │ ─────────────────────────>│
│ │ play_id döner │
│ │ │
│ [30 saniye sonra] │ │
│ │ │
│ 7. track-hit │ │
│ ─────────────────────────>│ play_count++ │
│ │ ─────────────────────────>│
│ │ │
│ [Şarkı bitince] │ │
│ │ │
│ 8. track-end │ │
│ ─────────────────────────>│ UPDATE listened_duration │
│ │ ─────────────────────────>│
│ │ │
│ 9. queue/refill │ │
│ ─────────────────────────>│ SELECT next songs │
│ │ ─────────────────────────>│
│ Yeni şarkılar │ <─────────────────────────│
│ <─────────────────────────│ │
│ │ │
▼ ▼ ▼
API Endpoints (8 Adet)
| Method | Endpoint | Açıklama | Süre |
|---|---|---|---|
| GET | /api/muzibu/songs/{id}/stream | Şifreli stream URL al | ~150ms |
| POST | /api/muzibu/songs/{id}/track-start | Dinleme kaydı başlat | ~50ms |
| POST | /api/muzibu/songs/{id}/track-hit | 30sn sonra hit kaydet | ~30ms |
| POST | /api/muzibu/songs/{id}/track-end | Dinleme bitişi kaydet | ~30ms |
| POST | /api/muzibu/queue/refill | Sırayı yenile (15 şarkı) | ~100ms |
| GET | /hls/muzibu/songs/{id}/playlist.m3u8 | HLS playlist dosyası | ~50ms |
| GET | /hls/muzibu/songs/{id}/segment-*.ts | HLS segment dosyaları | ~20ms/adet |
| GET | /api/muzibu/songs/{id}/key | HLS şifreleme anahtarı | ~10ms |