Cihaz Profil Sistemi Refaktör Planı

Muzibu - Eşzamanlı Dinleme Engelleme & Cihaz Takip Sistemi

Kritik Sistem Değişikliği

Proje Amacı

1. Eşzamanlı Dinleme Engelleme

Aynı hesabın farklı cihazlarda aynı anda müzik dinlemesini tespit edip engellemek. Hesap paylaşımını önlemek.

2. Donma Şikayetlerine Kanıt

Kullanıcı "müzik donuyor" dediğinde cihaz/bağlantı verisiyle kanıt sunmak. Bizi suçlayamasınlar.

3. Veri Normalizasyonu

song_plays'deki tekrarlı cihaz bilgilerini device_profiles'a taşıyarak veri tekrarını önlemek.

4. Cihaz Bazlı Analitik

Hangi cihazlardan dinleniyor, eski cihaz uyarıları, tarayıcı dağılımı gibi analizler.

Veritabanı Değişiklikleri

Eski Yapı (song_plays)

song_plays:
├── id
├── song_id
├── user_id
├── device_profile_id
├── ip_address       ← TEKRAR
├── user_agent       ← TEKRAR
├── device_type      ← TEKRAR
├── browser          ← TEKRAR
├── platform         ← TEKRAR
├── listened_duration
├── was_skipped
└── ...

Her şarkı çalışında aynı cihaz bilgileri tekrar tekrar kaydediliyor.

Yeni Yapı (Normalize)

device_profiles:
├── device_profile_id
├── fingerprint (unique)
├── user_id
├── user_agent       ← YENİ
├── device_type      ← YENİ
├── browser, browser_version
├── platform, platform_version
├── device_memory, cpu_cores
├── screen_resolution
├── is_touch, is_mobile
└── ip_address

song_plays:
├── id
├── song_id
├── user_id
├── device_profile_id → FK
├── ip_address (o anki)
├── listened_duration
├── was_skipped
└── ... (cihaz bilgileri YOK)

Önemli: Eski song_plays verileri SİLİNMEYECEK. Sadece yeni kayıtlarda cihaz bilgileri tutulmayacak.

TODO Listesi

1 Migration Güncellemeleri

device_profiles tablosuna user_agent (VARCHAR 500) ekle Modules/Muzibu/database/migrations/
device_profiles tablosuna device_type (VARCHAR 20) ekle mobile/tablet/desktop
Tenant migration dosyalarını da güncelle migrations/tenant/ klasörü

2 Model Güncellemeleri

DeviceProfile.php - $fillable'a user_agent, device_type ekle Modules/Muzibu/App/Models/DeviceProfile.php
DeviceProfile.php - device_type accessor'ı güncelle (DB'den oku) Mevcut accessor hesaplıyordu, artık DB'den gelecek
SongPlay.php - Cihaz bilgisi alanlarını opsiyonel yap Eski kayıtlar için gerekli, yeni kayıtlarda boş olacak

3 API/Controller Güncellemeleri

SongStreamController.php - trackStart() güncelle Cihaz bilgilerini song_plays'e değil device_profiles'a kaydet
SpeedTestController.php - storeDeviceProfile() güncelle user_agent ve device_type kaydetsin
Eşzamanlı dinleme kontrolü ekle Aynı user_id, farklı device_profile_id, ended_at=NULL → engelle

4 Admin Panel Güncellemeleri

ListeningHistoryComponent.php - Cihaz bilgisini device_profiles'dan çek with('deviceProfile') ekle, eski kayıtlar için fallback
listening-history-component.blade.php - View güncelle deviceProfile ilişkisinden cihaz bilgisi göster
StatsComponent.php - device_type sorgusu güncelle device_profiles tablosundan JOIN ile çek
CorporateUsageComponent.php - Cihaz istatistikleri ekle Kurumsal hesap cihaz dağılımı

5 Frontend/Player Güncellemeleri

device-profiler.js - user_agent gönder navigator.userAgent bilgisini ekle
player-core.js - Eşzamanlı dinleme hata mesajı 409 Conflict response'u handle et
system-check.js - Cihaz bilgisi gösterimini güncelle device_type göster

6 Frontend Sayfa Güncellemeleri

Dinleme geçmişi sayfası (kullanıcı tarafı) Cihaz bilgisi device_profiles'dan
Profil/Hesap sayfası - Aktif cihazlar listesi Kullanıcının cihazlarını göster

Etkilenen Dosyalar

Migrations

  • • 2026_02_04_000001_create_muzibu_device_profiles_table.php
  • • tenant/2026_02_04_000001_create_muzibu_device_profiles_table.php
  • • (YENİ) 2026_02_04_000004_add_user_agent_to_device_profiles.php

Models

  • • Modules/Muzibu/App/Models/DeviceProfile.php
  • • Modules/Muzibu/App/Models/SongPlay.php

Controllers

  • • Api/SongStreamController.php
  • • Api/SpeedTestController.php

Livewire

  • • Admin/ListeningHistoryComponent.php
  • • Admin/StatsComponent.php
  • • Admin/CorporateUsageComponent.php

Views (Admin)

  • • listening-history-component.blade.php
  • • stats-component.blade.php

Frontend JS

  • • js/player/features/device-profiler.js
  • • js/player/core/player-core.js
  • • js/system-check.js

Eşzamanlı Dinleme Engelleme Mantığı

// SongStreamController::trackStart()

$activePlay = SongPlay::where('user_id', $userId)
    ->whereNull('ended_at')
    ->where('device_profile_id', '!=', $currentDeviceProfileId)
    ->where('created_at', '>', now()->subMinutes(5))
    ->first();

if ($activePlay) {
    return response()->json([
        'error' => 'concurrent_streaming',
        'message' => 'Bu hesap başka bir cihazda aktif olarak müzik dinliyor.',
        'device' => $activePlay->deviceProfile?->summary
    ], 409);
}
4 Şubat 2026 • Muzibu.com