Muzibu Infinite Queue

Component Visual Indicators & Context System

Tek şarkı tıklansa bile albümle hareket eder, sonsuz kuyruk hiyerarşisi ile müzik hiç bitmez

📅 20 Aralık 2025 | 🎯 Component Tasarım Planı

📝 Basit Anlatım (Herkes İçin)

Ne Değişecek?

🎵 Tek Şarkı Tıklasan Bile Albüm Çalar

Şu anda: Tek şarkıya tıkladığında sadece o şarkı çalar, biter.

Yeni: Tek şarkıya tıkladığında o şarkının albümü baştan çalar, album bitince benzeri müzikler devam eder (sonsuz).

👁️ Hangi Şarkı Çalıyor Belli Olacak

Çalan şarkının satırı renkli, animasyonlu gösterilecek (Spotify gibi).

Bonus: Albüm adı da gösterilecek (şu anda sadece şarkı adı var).

♾️ Müzik Hiç Bitmez

Album bitince → Aynı türdeki (Jazz, Pop vb.) şarkılar devam eder → O da bitmez, başa sarar.

Örnek: "Bir Zamanlar" şarkısına tıkladın → "Gece Yolcuları" albümü çalar → Album biter → Jazz şarkıları çalar (sonsuz).

📻 Radyolar Farklı Çalışır

Radyolarda album mantığı yok, direkt sonsuz devam eder.

Örnek: "Jazz Radyo" → Jazz şarkıları sonsuz döngüde.

🔧 Teknik Detaylar (Geliştiriciler İçin)

🎯 Context Hiyerarşisi (Mevcut Sistem)

Level 3 (Top): Search, Popular, Favorites, Artist, Playlist

Level 2 (Middle): Album

Level 1 (Bottom - Infinite): Genre ♾️

Referans: Context-Based Infinite Queue

🔄 Yeni Gereksinim: Album-First Logic

Kullanıcı tek şarkıya tıkladığında:

  1. Şarkının album_id çek
  2. Album context set et: {type: 'album', id: album_id}
  3. Albümü baştan çal (tıklanan şarkıdan değil!)
  4. Album bitince → Genre context'e geç
  5. Genre hiç bitmesin (loop)

⚠️ ÖNEMLİ: Album bitince tekrar album ÇALMASIN! Direkt Genre'ye geç.

📻 Radyo Exception

Radyo tıklandığında:

{type: 'radio', id: radio_id} → Direkt infinite loop (No album step)

Radyo kendi içinde sonsuz döner, hiyerarşiye gitmez.

🎨 Component Değişiklikleri

1. Song Row (Şarkı Satırı)

✅ Eklenenler:

  • Album Bilgisi: Şarkı adının altında album adı
  • Playing Indicator: Çalan şarkı için animasyonlu dalga ikonu
  • Active State: Çalan şarkının row'u coral renk
  • Context Data: data-album-id, data-genre-id attributeleri

Örnek Görünüm:

🎵 Bir Zamanlar

Gece Yolcuları

💡 NOT: Artist name YOK (sistem tek artist), sadece album adı eklenecek.

2. Album Card (Albüm Kartı)

✅ Eklenenler:

  • Playing Badge: Album çalıyorsa "🎵 Çalıyor" badge'i
  • Context Data: data-context-type="album" attribute
  • Glow Effect: Aktif album için coral glow

Active State Örneği:

🎵 Çalıyor

3. Playlist Card (Playlist Kartı)

✅ Eklenenler:

  • Playing Badge: "🎵 Çalıyor" göstergesi
  • Context Logic: Playlist → Album → Genre hiyerarşisi
  • Visual Feedback: Aktif playlist glow efekti

4. Radio Card (YENİ - Radyo Kartı)

✅ Özellikler:

  • Infinite Badge: "♾️ Sonsuz" göstergesi
  • No Album Step: Direkt infinite loop
  • Context Data: data-context-type="radio"
  • Playing Animation: Radyo çalarken pulse animasyonu

⚡ Radyolarda album mantığı YOK! Tıklandığında direkt sonsuz çalar.

👁️ Visual Indicator Detayları

🎵 Çalan Şarkı

Visual:

• Row background: coral gradient

• Index → Animated waveform icon

• Song name: coral color + bold

CSS Classes:

bg-muzibu-coral/10 border-l-4 border-muzibu-coral

💿 Aktif Album

Visual:

• Badge: "🎵 Çalıyor"

• Cover: coral glow shadow

• Card: subtle border glow

CSS Classes:

shadow-xl shadow-muzibu-coral/30

📻 Aktif Radyo

Visual:

• Badge: "♾️ Çalıyor"

• Icon: pulse animation

• Background: animated gradient

CSS Animation:

animate-pulse

✅ Implementation Checklist

Frontend (Blade Templates)

JavaScript (Player Logic)

Testing

💻 Örnek Kod Yapısı

Song Row (HTML + Data Attributes)

<div class="song-row group"
     data-song-id="42"
     data-album-id="12"
     data-genre-id="9"
     data-context-type="song">
    <div class="index">1</div>
    <img src="cover.jpg" class="cover">
    <div class="song-info">
        <h3 class="song-name">Bir Zamanlar</h3>
        <!-- YENİ: Album adı -->
        <p class="album-name text-slate-400">Gece Yolcuları</p>
    </div>
    <div class="duration">3:45</div>
    <div class="actions">...</div>
</div>

Album Card (HTML + Playing Badge)

<div class="album-card"
     data-album-id="12"
     data-context-type="album">
    <div class="cover-wrapper">
        <!-- YENİ: Playing badge -->
        <span class="playing-badge hidden">🎵 Çalıyor</span>
        <img src="album-cover.jpg">
        <button class="play-btn">▶</button>
    </div>
    <h3>Gece Yolcuları</h3>
</div>

Radio Card (YENİ - HTML Structure)

<div class="radio-card"
     data-radio-id="5"
     data-genre-id="9"
     data-context-type="radio">
    <div class="cover-wrapper">
        <!-- Infinite badge -->
        <span class="infinite-badge">♾️ Sonsuz</span>
        <span class="playing-badge hidden">📻 Çalıyor</span>
        <img src="radio-icon.jpg">
        <button class="play-btn">▶</button>
    </div>
    <h3>Jazz Radyo</h3>
</div>

JavaScript Play Logic (Pseudo-code)

function playSong(songElement) {
    const songId = songElement.dataset.songId;
    const albumId = songElement.dataset.albumId;
    const genreId = songElement.dataset.genreId;

    // YENİ: Auto-set album context
    if (albumId) {
        setPlayContext({
            type: 'album',
            id: albumId,
            genreId: genreId,
            nextContext: {type: 'genre', id: genreId} // Album bitince genre
        });
    }

    // Play albümü baştan (not from clicked song!)
    playAlbumFromStart(albumId);

    // Update visual indicators
    updatePlayingIndicators(songId, albumId);
}

function playRadio(radioElement) {
    const radioId = radioElement.dataset.radioId;
    const genreId = radioElement.dataset.genreId;

    // Radyo: Direkt infinite loop (no album step)
    setPlayContext({
        type: 'radio',
        id: radioId,
        genreId: genreId,
        infinite: true // Sonsuz döngü
    });

    playRadioInfinite(radioId, genreId);
}

📌 Özet & Kritik Noktalar

✅ Yapılacaklar:

  • ✓ Song-row: Album adı ekle
  • ✓ Song-row: Data attributes (album-id, genre-id)
  • ✓ Song-row: Playing indicator (waveform, coral background)
  • ✓ Album-card: Playing badge "🎵 Çalıyor"
  • ✓ Album-card: Active glow effect
  • ✓ Radio-card: Yeni component (♾️ badge, pulse animation)
  • ✓ JavaScript: Album-first logic
  • ✓ JavaScript: Album bitince → Genre (tekrar album YOK)
  • ✓ JavaScript: Radio → Direkt infinite

⚠️ Kritik Noktalar:

  • 🔴 Album bitince tekrar ALBUM ÇALMASIN!
  • 🔴 Tek şarkı tıklansa bile albümle başlasın
  • 🔴 Radyo hiyerarşiye GİTMESİN (kendi infinite loop)
  • 🔴 Artist name YOK, sadece album name
  • 🔴 Visual indicators responsive olmalı