v7 27 Şubat 2026

Dinamik İçerik Sistemi — Basit Özet

Ne yapıyoruz, tablolarda ne var, admin'de ne yapılıyor, sitede ne görünüyor.

Ne Yapıyoruz?

Muzibu orta alanını (main) saate, güne, sektöre ve gösterildiği sayfaya göre değişen bir sisteme çeviriyoruz.

Admin panelden "Koleksiyon" denen gruplar oluşturulacak. Her koleksiyonun içine Playlist, Albüm, Radyo, Genre veya Sektör eklenebilecek.

Örnek: "Sabah Kafe Mix" → hafta içi 06:00-12:00, anasayfada, Kafe sektörüne gösterilir.

Kullanıcı sayfayı açık bıraksa bile her saat başı içerik otomatik güncellenir, müzik kesilmez.

Neye Dokunuyoruz, Neye Dokunmuyoruz?
Değişecek
Anasayfa + Sektör + Radyo + Genre sayfaları ORTA ALAN (main). Koleksiyon atanmamış sayfalarda mevcut görünüm korunur (fallback).
Dokunulmayacak
Left sidebar, right sidebar, header, player bar, footer — hepsi aynen kalacak.

Sayfa Yapısı

SayfaURLAlt Sayfavisibility_rules Key
Anasayfa / Yok (tek sayfa) sector_ids (kullanıcı filtresi)
Sektörler /sectors/{slug} Her sektörün kendi sayfası sector_ids → hangi sektör sayfalarında
Türler /genres/{slug} Her genre'nin kendi sayfası genre_ids → hangi genre sayfalarında
Radyolar /radios Yok (tek sayfa) Yok — show_on: ["radio"] yeterli
Koleksiyon Detay YENİ /collections/{slug} "Tümünü Gör" sayfası
Sektör alt sayfaları (/sectors/{slug}/radios, /sectors/{slug}/playlists) kalkacak. Her sektörün tek bir ana sayfası: /sectors/{slug}

Fallback Sistemi

Koleksiyon atanmamış veya aktif koleksiyonu olmayan sayfalarda mevcut görünüm korunur.

Aktif Koleksiyon YOK → Fallback
Mevcut görünüm aynen çalışır. Hiçbir şey değişmez.
1+ Aktif Koleksiyon VAR → Yeni Sistem
Koleksiyonlar sırayla gösterilir.
Aktif koleksiyon = is_active=1 VE en az 1 aktif öğesi var (items.is_active=1). İçindeki tüm öğeler pasifse → koleksiyon da pasif sayılır, gösterilmez.
Avantaj: Sayfa sayfa geçiş yapılabilir. Sorun olursa koleksiyonu kapat → otomatik fallback'e döner. Sıfır risk.

Her Koleksiyonun 3 Sorusu

Admin bir koleksiyon oluştururken şu 3 şeyi ayarlar. Tasarım otomatik belirlenir.

NEREDE?
Hangi sayfa tiplerinde?
Kolon: show_on
Anasayfa, Sektör, Radyo, Genre... Birden fazla seçilebilir.
NE ZAMAN?
Hangi günler, hangi saatlerde?
Kolon: display_rules
Günlere özel saat aralıkları. Birden fazla zamanlama eklenebilir.
KİME / HANGİ SAYFAYA?
Hedef kitle + hedef sayfa
Kolonlar: visibility_rules + corporate_account_id
Herkese, belirli sektörlere, belirli genre'lara, firmaya özel...
NASIL?
OTOMATİK
İçerik tipine göre otomatik:
Sadece Genre → Grid (15 kart)
Diğer → Yatay Kaydırma (10 kart)

display_rules Detayı GÜNCELLENDİ

Günlere özel saat aralıkları. Birden fazla zamanlama tanımlanabilir:

Her Zaman
{"is_always": true}
7/24 görünür, gün ve saat kısıtlaması yok.
Hafta İçi Sabah
{"schedules": [
  {"days":[1,2,3,4,5], "start_hour":6, "end_hour":12}
]}
Pazartesi-Cuma, 06:00-12:00 arası.
Hafta İçi + Hafta Sonu Farklı
{"schedules": [
  {"days":[1,2,3,4,5], "start_hour":6, "end_hour":12},
  {"days":[6,7], "start_hour":10, "end_hour":14}
]}
Hafta içi 06-12, hafta sonu 10-14.
Gece Geçişli (Cross-midnight)
{"schedules": [
  {"days":[5,6], "start_hour":22, "end_hour":6}
]}
Cuma-Cumartesi, 22:00→06:00. start > end ise gece geçişi: 22,23,00,01,02,03,04,05.
Gün numaraları: 1=Pazartesi, 2=Salı, 3=Çarşamba, 4=Perşembe, 5=Cuma, 6=Cumartesi, 7=Pazar (ISO 8601)
Admin formu:
Her zaman göster
Zamanlama 1:
Pzt Sal Çar Per Cum Cmt Paz
Saat: 06:0012:00
Zamanlama 2:
Pzt Sal Çar Per Cum Cmt Paz
Saat: 10:0014:00
+ Zamanlama Ekle

visibility_rules Detayı

Tek JSON kolon. Sektör ve genre filtresi:

Herkese / Her Yerde
{"show_to_all": true}
veya NULL → filtre yok.
Sektöre Göre
{"sector_ids": [1, 3]}
Anasayfada: kullanıcı filtresi. Sektör sayfasında: sayfa filtresi.
Genre'a Göre
{"genre_ids": [5, 8]}
Genre sayfasında: sayfa filtresi. Rock + Jazz sayfalarında görünür.
Karışık
{"sector_ids": [1], "genre_ids": [5]}
Anasayfada Kafe'ye + Genre'da Rock'a.
corporate_account_id: Ayrı kolon (FK). NULL = herkes, dolu = firmaya özel.

Kullanılacak Kartlar

Yeni kart yapılmayacak. Mevcut component'ler aynen kullanılacak:

ComponentNe İçinTıklanıncaTasarım
x-muzibu.playlist-card Çalma listesi Şarkı listesi açılır Yatay kaydırma
x-muzibu.album-card Albüm Albüm detayı açılır Yatay kaydırma
x-muzibu.radio-card Radyo Hemen çalar (sayfa değişmez) Yatay kaydırma
x-muzibu.genre-quick-card Tür Genre sayfası açılır Grid
x-muzibu.sector-card Sektör Sektör sayfası açılır Yatay kaydırma

Tablo 1: muzibu_content_collections

Her satır bir koleksiyon. Admin panelden oluşturulur. 12 kolon.

KolonTipNe İşe YararÖrnek
collection_idBIGINT PKOtomatik numara1, 2, 3
titleJSONKoleksiyon adı (çoklu dil){"tr": "Sabah Kafe Mix"}
slugJSONURL kısa ismi{"tr": "sabah-kafe-mix"}
descriptionJSON NULLAçıklama (opsiyonel){"tr": "Sabah için..."}
show_on JSON NEREDE: Hangi sayfa tiplerinde? ["homepage", "sector", "radio", "genre"]
display_rules GÜNCELLENDİ JSON NULL NE ZAMAN: Günlere özel saat aralıkları {"schedules":[{"days":[1,2,3,4,5],"start_hour":6,"end_hour":12}]}
visibility_rules JSON NULL KİME: Sektör + genre filtresi {"sector_ids":[1]} veya {"genre_ids":[5,8]}
corporate_account_id FK NULL KİME (firma): NULL = herkes NULL veya 5
iconVARCHAR NULLBaşlık ikonufas fa-coffee
colorVARCHAR NULLRenk kodu#f59e0b
media_idFK NULLKapak görseli42
sort_orderINTSıralama (küçük = üstte)1, 2, 3
is_activeBOOLEANAçık / Kapalı1

Tablo 2: muzibu_collection_items

Her satır, bir koleksiyona eklenmiş bir öğe. 6 kolon.

KolonTipNe İşe YararÖrnek
idBIGINT PKOtomatik numara1, 2, 3
collection_idFKHangi koleksiyona ait1
itemable_typeVARCHARÖğe türü (5 seçenek)playlist, album, radio, genre, sector
itemable_idBIGINTÖğenin ID'si12
sort_orderINTSıralama (sürükle-bırak)1, 2, 3
is_activeBOOLEANAktif mi?1
Örnek: "Sabah Kafe Mix" koleksiyonu (id=1)
collection_id=1, type=radio, id=5 (Jazz FM), sort_order=1
collection_id=1, type=playlist, id=12 (Sabah Akustik), sort_order=2
collection_id=1, type=playlist, id=45 (Kahve Molası), sort_order=3
collection_id=1, type=album, id=8 (Cafe Classics), sort_order=4

Ek: users Tablosuna Eklenen Kolon

KolonTipNe İşe YararÖrnek
sector_idFK NULLKullanıcının sektörü. Kafe sahibi = Kafe koleksiyonlarını görür.1

Admin Panelde Ne Yapılacak?

1
Koleksiyon Oluştur
İsim ver, ikon ve renk seç. Kapak görseli ekle (opsiyonel).
2
Nerede Görünsün?
Anasayfa, Sektör, Radyo, Genre... Birden fazla seçilebilir.
3
Gün + Saat Ayarla GÜNCELLENDİ
"Her zaman" veya günlere özel saat aralıkları. Birden fazla zamanlama eklenebilir. Cross-midnight destekli (22:00→06:00).
4
Kime / Hangi Sayfaya?
Herkese → hiçbir şey seçme
Sektöre göre → sektör seç (anasayfada kullanıcı filtresi + sektör sayfasında sayfa filtresi)
Genre'a göre → genre seç (genre sayfasında sayfa filtresi)
Firmaya özel → corporate hesap seç
5
İçerik Ekle
Playlist, Albüm, Radyo, Genre veya Sektör ekle. Sürükle-bırak ile sırala.
6
Koleksiyonları Sırala
sort_order ile sürükle-bırak (küçük numara üstte).

Sitede Ne Olacak?

1
Sayfa Açılır → Fallback Kontrolü
Aktif koleksiyon var mı? Yoksa → mevcut görünüm. Varsa → koleksiyon sistemi.
2
Koleksiyonlar Listelenir
O güne + o saate + o hedefe uygun koleksiyonlar sırayla. Genre-only → grid (15), diğer → yatay kaydırma (10).
3
Tıklama
Radyo → hemen çalar   Playlist/Albüm → şarkı listesi   Genre/Sektör → ilgili sayfa
4
"Tümünü Gör" YENİ
Kart sayısı aşılırsa → buton çıkar → /collections/{slug} sayfasında tüm öğeler grid'de gösterilir.
5
Her Saat Başı Otomatik Güncelleme
Sayfa yenilenmez, müzik kesilmez. Sadece orta alan sessizce güncellenir.

Senaryo Örnekleri

Senaryo 1: Henüz hiç koleksiyon yok
Tüm sayfalar → Fallback: Şu anki görünümleri aynen devam eder.
Senaryo 2: Sadece anasayfaya 3 koleksiyon atandı
Anasayfa → Koleksiyon sistemi
Diğer tüm sayfalar → Fallback
Senaryo 3: "Cuma Gece Parti" koleksiyonu
show_on: ["homepage"]
display_rules: {"schedules": [{"days": [5,6], "start_hour": 22, "end_hour": 6}]}
visibility_rules: {"show_to_all": true}
→ Cuma ve Cumartesi 22:00-06:00 arası, herkesin anasayfasında görünür.
Senaryo 4: "Rock Klasikleri" — Genre sayfasına özel
show_on: ["genre"]
display_rules: {"is_always": true}
visibility_rules: {"genre_ids": [5]}
→ Sadece Rock genre sayfasında (/genres/rock), her zaman görünür.

Referans: Mevcut Sayfa Görünümleri (Fallback)

SayfaMevcut İçerikKart / Tasarım
Anasayfa Türler (15, grid) + Playlistler (10, yatay) + Albümler (10, yatay) + Radyolar (10, yatay) + Sektörler (10, yatay) 5 bölüm, 55 kart toplam
/sectors/{slug} O sektöre ait radyolar + playlistler 2 bölüm, yatay kaydırma
/genres/{slug} O türe ait playlistler Hero + playlist listesi
/radios Tüm radyolar listesi Grid/liste
Versiyon Geçmişi
v1: İlk özet. type ENUM, priority, is_featured, cache_ttl, business_rules.
v2: type kaldırıldı → show_on + template. priority → sort_order. is_featured + cache_ttl kaldırıldı.
v3: business_rules kaldırıldı. corporate_account_id FK eklendi.
v4: template kolonu kaldırıldı (otomatik tespit). Mevcut kartlar, kart sayıları (15/10), "Tümünü Gör". 13→12 kolon.
v5: sector_rules → visibility_rules. Sektör + genre + radyo filtresi tek JSON'da.
v6: Sayfa yapısı netleşti. radio_ids yok (tek sayfa). Fallback sistemi. Sektör alt sayfaları kalkacak. Senaryo örnekleri.
v7: display_rules detaylandı: günlere özel saat aralıkları (schedules dizisi), cross-midnight desteği (22→06). /collections/{slug} "Tümünü Gör" sayfası eklendi. Aktif öğesi olmayan koleksiyon = pasif. Karşılama (greeting) kaldırıldı.

Teknik detaylar, kod örnekleri ve tüm kararlar için:

Tam Dokümantasyon (v10)

Not: v10 henüz v7 değişikliklerini içermiyor, güncellenecek.