✅ Mevcut DB Yapısı ile Genre Uyumluluk

30,000 şarkı + Mevcut tablo yapısı → Yeni tablo YOK! Kod bazlı çözüm ✨

🎯 Gerçek Durum: 30,000 şarkı eski DB'den gelecek. Yeni tablo oluşturamayız. ✅ Çözüm: Mevcut genre_id kullan + Kod içinde genre group mapping!

📅 5 Aralık 2025 🎯 Existing DB Analysis 👤 Real Database Solution

📊 Mevcut Database Yapısı (muzibu_mayis25.sql)

🎵 muzibu_songs Tablosu

id INT
title_tr VARCHAR
album_id INT
genre_id INT
duration INT
file_path VARCHAR
lyrics_tr TEXT
play_count INT
active BOOLEAN
✅ Mevcut: Her şarkının 1 genre_id var (tekli ilişki)

🎸 muzibu_genres Tablosu

id INT
title_tr VARCHAR
slug VARCHAR
description_tr TEXT
thumb VARCHAR
✅ Toplam: 32 genre var (Blues, Jazz, Rock, Metal, Tasavvufi...)

😊 muzibu_moods Tablosu

id INT
title_tr VARCHAR
created DATETIME
✅ Mevcut: 2 mood var (Slow, Hızlı)
💡 Genişletilebilir: Yeni mood'lar eklenebilir

🔗 muzibu_song_mood (Many-to-Many)

song_id INT (FK)
mood_id INT (FK)
✅ İlişki: 1 şarkı → Birden fazla mood
💡 Kullanım: Opsiyonel (çoğu şarkıda yok)

🎸 Mevcut 32 Genre (Database'den)

1. Blues
2. Bossa Nova
3. Chill & Lo-Fi
4. Country
5. Electro
6. Folk
7. Funk
8. Instrumental
9. Jazz
10. Latin
11. Pop
12. Rap & Hip-hop
13. R&B Soul
14. Reggae
15. Rock
16. Modern Halk
17. Classical
18. Greek Stil
19. Italian Vibes
20. Voices of Spain
21. Enstrümantal TSM
22. French Music
23. Japanese Music
24. Metal
25. Lounge / Chillout
26. House
27. Tasavvufi 🕌
28. Korean Music
29. Türkçe Müzik
30. Irish
31. Indie Music
32. Happy

🕌 ÖNEMLİ: Tasavvufi (ID: 27) zaten var! İlahi/Dini müzik için kullanabiliriz.

✅ Çözüm: Kod Bazlı Genre Group Mapping

📁 config/genre_groups.php (Yeni Dosya)

<?php
 
return [
// Grup 1: Dini/Manevi - STRICT MODE
'religious' => [
'name' => 'Dini/Manevi',
'genres' => [27], // Tasavvufi
'strict' => true, // ASLA başka genre ile karışmasın
'can_mix_with' => [], // Sadece kendi içinde
],
 
// Grup 2: Rock Ailesi
'rock' => [
'name' => 'Rock Ailesi',
'genres' => [15, 24], // Rock, Metal
'strict' => true,
'can_mix_with' => ['energetic'], // Ortak enerji
],
 
// Grup 3: Türk Müzikleri
'turkish' => [
'name' => 'Türk Müzikleri',
'genres' => [16, 21, 29], // Halk, TSM, Türkçe
'strict' => true,
'can_mix_with' => [],
],
 
// Grup 4: Sakin/Restoran
'calm' => [
'name' => 'Sakin/Restoran',
'genres' => [2, 8, 9, 17, 25], // Bossa, Instrumental, Jazz, Classical, Lounge
'strict' => false,
'can_mix_with' => ['cafe'],
],
 
// Grup 5: Kafe/Rahat
'cafe' => [
'name' => 'Kafe/Rahat',
'genres' => [1, 3, 6, 31], // Blues, Chill, Folk, Indie
'strict' => false,
'can_mix_with' => ['calm'],
],
 
// Grup 6: Enerjik/Gym
'energetic' => [
'name' => 'Enerjik/Gym',
'genres' => [5, 12, 26], // Electro, Rap, House
'strict' => true,
'can_mix_with' => ['rock'],
],
];

🔧 Helper Function (app/Helpers/GenreHelper.php)

namespace App\Helpers;
 
class GenreHelper
{
public static function getAllowedGenres($genreId): array
{
$groups = config('genre_groups');
 
// Genre hangi grupta?
foreach ($groups as $groupKey => $group) {
if (in_array($genreId, $group['genres'])) {
$allowedGenres = $group['genres'];
 
// Strict değilse mix edilebilir grupları ekle
if (!$group['strict']) {
foreach ($group['can_mix_with'] as $mixGroup) {
$allowedGenres = array_merge($allowedGenres, $groups[$mixGroup]['genres']);
}
}
 
return array_unique($allowedGenres);
}
}
 
return [$genreId]; // Grup bulunamazsa sadece kendisi
}
}

🔄 Queue Refill Logic (player-core.js)

async function refillQueue() {
// 1. Son 5 şarkının genre_id'lerini al
const lastGenreIds = queue.slice(-5).map(s => s.genre_id);
 
// 2. En çok tekrar eden genre_id'yi bul
const mostCommonGenreId = getMostCommon(lastGenreIds);
 
// 3. Backend'den izin verilen genre'leri al
const response = await fetch(`/api/business/allowed-genres/${mostCommonGenreId}`);
const { allowedGenres } = await response.json();
// allowedGenres = [27] (Tasavvufi ise sadece 27 döner - strict)
// allowedGenres = [9, 17, 25] (Jazz ise calm grubu döner)
 
// 4. İzin verilen genre'lerden rastgele şarkı al
const newSongsResponse = await fetch(`/api/business/queue/refill`, {
method: 'POST',
body: JSON.stringify({ allowedGenres, limit: 10 })
});
 
const newSongs = await newSongsResponse.json();
 
// 5. Queue'ya ekle
queue.push(...newSongs);
}

✅ Bu Çözümün Avantajları

🎯 Mevcut Yapıyı Kullanır

  • Yeni tablo YOK - Sadece config dosyası
  • 30,000 şarkı uyumlu - Hiçbir veri migration gerekmez
  • Mevcut genre_id kullan - Şarkılara dokunmaya gerek yok
  • Hızlı implement - 4-6 saat

🔧 Esnek & Yönetilebilir

  • Config dosyası - Kod değişikliği gerekmeden grup güncelle
  • Kolay test - Grupları deneme-yanılma ile ayarla
  • Gelecek proof - Yeni genre eklenince sadece config güncelle
  • Performanslı - In-memory array, hızlı lookup

🔒 %100 Güvenli

  • Strict mode - Tasavvufi ASLA başka genre ile karışmaz
  • Group locking - İlahi + Rock imkansız
  • Backend kontrol - Frontend manipüle edemez

📊 Business Category Desteği

  • Cami Modu → Sadece Tasavvufi (ID: 27)
  • Rock Bar → Rock + Metal (ID: 15, 24)
  • Kafe → Blues, Chill, Folk, Indie (esnek mix)

🎵 Örnek: Cami Modu (Tasavvufi)

1️⃣ Kullanıcı "Cami Modu" seçer

→ Sistem Tasavvufi genre'sini (ID: 27) başlatır

2️⃣ İlk 30 Tasavvufi şarkı başlar

Mevcut DB'de genre_id = 27 olan şarkılar

3️⃣ Queue 5 şarkıya düşer → refillQueue() tetiklenir

→ Son 5 şarkının hepsi genre_id = 27 (Tasavvufi)
GenreHelper::getAllowedGenres(27) çağrılır
→ Config'den strict: true döner → Sadece [27]

4️⃣ Yeni 10 Tasavvufi şarkı eklenir

SELECT * FROM muzibu_songs WHERE genre_id = 27 AND ...
→ Sadece Tasavvufi şarkılar gelir

5️⃣ Sonsuza kadar Tasavvufi devam eder ✅

Hard Rock, Metal, Pop → ASLA karışmaz! 🔒