Muzibu Müzik Çalar - Detaylı Sistem Analizi

🏢

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.

Kafe & Restoran
Mağaza & AVM
Otel & Spa
Ofis & Çalışma Alanı
Spor Salonu & Fitness
Kuaför & Güzellik Salonu
9
Toplam Aşama
~800ms
İlk Şarkı Başlama
8
API Endpoint
%65
Cache Hız Kazancı

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ı)

Aşama 1-5: İlk ses için (sıralı)
Aşama 6: Sıra Oluşturma
Aşama 7: Paralel (async)
Aşama 8-9: Şarkı bitince
1

Yetki Kontrolü (Auth Check)

~50ms Zorunlu

Kullanıcı giriş yapmış mı ve premium üyeliği var mı kontrol edilir. Yetkisiz kullanıcılar giriş veya üyelik sayfasına yönlendirilir.

İşlem: playContent()
Kontrol: isLoggedIn
Kontrol: is_premium
Hata: 401/402
0ms 50ms
2

Stream URL Alma

~150ms Zorunlu

Sunucudan şarkının oynatma adresi istenir. Bu adres şifrelenmiş ve süreli olduğundan başkaları tarafından kopyalanıp kullanılamaz.

Endpoint: GET /stream
Cache: Redis 24h
İmza: HMAC-SHA256
Şifreleme: XOR
0ms 150ms
3

HLS Playlist İndirme

~80ms Zorunlu

HLS formatındaki playlist dosyası (m3u8) indirilir. Bu dosya şarkının parça listesini, şifreleme bilgilerini ve segment adreslerini içerir.

Endpoint: /hls/.../playlist.m3u8
Format: HLS (m3u8)
İçerik: Segment listesi
Sunucu: Laravel
0ms 80ms
4

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.

Endpoint: GET /songs/{id}/key
Şifreleme: AES-128
Boyut: 16 byte
İmza: HMAC doğrulama
0ms 40ms
5

İ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.

Endpoint: /hls/.../segment-000.ts
Boyut: ~200-500KB
Kütüphane: HLS.js
İşlem: Decrypt + Buffer
0ms 280ms
♫ Bu aşama tamamlandığında müzik başlar
6

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.

🔄 Queue YENİDEN Oluşturulur
  • • 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
✓ Queue KORUNUR (Ek süre yok)
  • • Ş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
Endpoint: POST /queue/initial
Şarkı Sayısı: 15 şarkı
Cache: Redis 5dk
DB Query: Context'e göre
Context Türleri ve Davranışları
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ç
💡 İşletme Senaryosu

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).

Her yeni tıklama ~150-300ms
7

Dinleme Kaydı (track-start)

~50ms Async/Paralel

Mü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.

Endpoint: POST /track-start
Tablo: song_plays
Dönen: play_id
UI Etkisi: Yok (async)
Paralel çalışır ~50ms
8

30 Saniye Sonra Hit Kaydı (track-hit)

~30ms 30sn Sonra

Kullanı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.

Endpoint: POST /track-hit
Tetikleme: 30.000ms sonra
İşlem: play_count++
UI Etkisi: Yok (async)
30 saniye sonra ~30ms
9

Ş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).

Endpoint 1: POST /track-end
Endpoint 2: POST /queue/refill
Kayıt: listened_duration
Kayıt: was_skipped
Şarkı bitince ~100ms

Toplam Süre Dağılımı (Her Şarkı Tıklamasında)

Müzik Başlayana Kadar (Sıralı - Toplam ~800ms)

1. Yetki Kontrolü ~50ms
6%
2. Stream URL Alma ~150ms
19%
3. HLS Playlist İndirme ~80ms
10%
4. HLS Şifreleme Anahtarı ~40ms
5%
5. İlk HLS Segment ~280ms
35%
6. Queue Initial (sıra oluşturma) ~200ms
25%

Paralel Çalışan (Müziği Bekletmez)

7. track-start (dinleme kaydı) ~50ms
async - müziği bekletmez

Şarkı Oynarken / Bitince

8. track-hit (30 saniye sonra) ~30ms
30sn sonra tetiklenir
9. track-end + queue/refill (şarkı bitince) ~100ms
şarkı bitince tetiklenir
Her Şarkı Tıklamasında ~800ms

Aşama 1-6 sıralı çalışır. Her yeni şarkıya tıklamada bu süre geçer.

Otomatik Geçişlerde ~0ms

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
Şarkı Cache
24 saat
Şarkı bilgileri Redis'te
Playlist Cache
1 saat
Playlist içerikleri
Genre Cache
1 hafta
Tür bilgileri

Preload Sistemi

Aktif

İlk Şarkı (Preload Yok)

  • Stream URL istenir (~150ms)
  • HLS playlist indirilir (~100ms)
  • İlk segment yüklenir (~300ms)
  • Müzik başlar
~600-650ms bekleme

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
~0ms bekleme

Bu İşlemler Kaldırılabilir mi?

Kaldırılamaz Kritik

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.

Değerlendirilebilir Opsiyonel

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.

Zaten Optimize Aktif

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

Cihaz türü mobile / tablet / desktop
Tarayıcı Chrome / Safari / Firefox...
İşletim sistemi Windows / iOS / Android...
Dinleme süresi listened_duration (saniye)
Skip durumu was_skipped (true/false)
Kaynak playlist / album / genre / radio

Kullanım Alanları

📊 Top 10 şarkı listeleri oluşturma
🎯 Kişiselleştirilmiş öneriler
💰 Sanatçı telif hesaplamaları
📱 Mobil vs masaüstü kullanım analizi
⏭️ Skip oranı ile kalite analizi
📈 Saatlik/günlük dinleme istatistikleri

Sistem Mimarisi

🖥️
Tarayıcı
Kullanıcının Cihazı
Framework: Alpine.js
Player: HLS.js
Fallback: Howler.js
Boyut: ~350KB
Sunucu
API & İş Mantığı
Framework: Laravel 12
Auth: Sanctum
Cache: Redis
Endpoint: 8 adet
🗄️
Depolama
Veri & Dosyalar
Database: MySQL
Dosyalar: HLS Segments
Şifreleme: AES-128
CDN: Nginx

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