Sistem Özeti
Basit Anlatım
Kurumsal müşteriler (restoranlar, ofisler, mağazalar) kendi sesli duyurularını şarkılar arasında yayınlayabilecek. Örneğin: "Değerli müşterilerimiz, kampanyamızdan yararlanmak için..." gibi anonslar her 10 şarkıda bir otomatik çalacak.
Teknik Özet
- • Player'a anons injection sistemi
- • 30sn dinleme = 1 geçerli şarkı sayacı
- • Şube bazlı durdur/devam kontrolü
- • Sıralı anons rotation sistemi
- • Admin yükleme & yönetim paneli
Gereksinimler
10 şarkıda bir anons (ana şube ayarlayabilir: 5-20 arası)
Şarkı 30 saniye dinlenirse 1 şarkı sayılır
Her şube anonsu durdurabilir/devam ettirebilir
Muzibu admin panelinden birden fazla anons yüklenebilir
Anonslar sırayla (rotation) çalar
Sadece kurumsal aboneliklerde aktif
Sistem Akışı
Veritabanı Tasarımı
muzibu_announcements (Anonslar)
| Kolon | Tip | Açıklama |
|---|---|---|
| id | BIGINT | Primary Key |
| title | VARCHAR(255) | Anons başlığı (admin için) |
| audio_path | VARCHAR(500) | MP3 dosya yolu |
| duration | INT | Süre (saniye) |
| position | INT | Sıralama (rotation için) |
| is_active | BOOLEAN | Aktif mi? |
| created_at, updated_at | TIMESTAMP | Laravel timestamps |
muzibu_corporate_announcement_settings (Kurumsal Ayarlar)
| Kolon | Tip | Açıklama |
|---|---|---|
| id | BIGINT | Primary Key |
| corporate_account_id | BIGINT FK | Ana şube ID (parent_id = null olan) |
| songs_between_announcements | INT | Kaç şarkıda bir anons (default: 10) |
| min_listen_duration | INT | Geçerli dinleme süresi (default: 30sn) |
| is_enabled | BOOLEAN | Anons sistemi açık mı? (ana şube) |
| current_announcement_index | INT | Rotation için son çalan anons indexi |
muzibu_branch_announcement_status (Şube Durumları)
| Kolon | Tip | Açıklama |
|---|---|---|
| id | BIGINT | Primary Key |
| corporate_account_id | BIGINT FK | Şube ID (ana veya alt şube) |
| user_id | BIGINT FK | Şube kullanıcısı |
| is_paused | BOOLEAN | Bu şube anonsu durdurdu mu? |
| song_counter | INT | Geçerli şarkı sayacı (30sn+) |
| last_announcement_at | TIMESTAMP | Son anons çalma zamanı |
muzibu_announcement_plays (İstatistikler)
| Kolon | Tip | Açıklama |
|---|---|---|
| id | BIGINT | Primary Key |
| announcement_id | BIGINT FK | Çalan anons |
| corporate_account_id | BIGINT FK | Hangi şubede çaldı |
| user_id | BIGINT FK | Dinleyen kullanıcı |
| listened_duration | INT | Kaç saniye dinlendi |
| was_skipped | BOOLEAN | Atlandı mı? |
| played_at | TIMESTAMP | Çalma zamanı |
API Endpoints
Admin Panel (Muzibu)
Kurumsal Panel (Ana Şube)
Şube Kontrolü (Tüm Şubeler)
Player API
Player Entegrasyonu
Mevcut Akış
- 1. Şarkı başlar
- 2. 30sn sonra trackHit() çağrılır
- 3. Şarkı biter → Sonraki şarkı
Yeni Akış (Anonslu)
- 1. Şarkı başlar
- 2. 30sn sonra trackHit() + incrementAnnouncementCounter()
- 3. Şarkı biter
- 4. checkAnnouncementTrigger() - Sayaç = 10 mi?
- 5a. Hayır → Sonraki şarkı
- 5b. Evet → Anons çal → Sayacı sıfırla → Sonraki şarkı
JavaScript Mantığı (Pseudo)
// Alpine.js Store - muzibu-store.js
announcementSystem: {
isEnabled: false, // Kurumsal mı?
isPaused: false, // Şube durdurdu mu?
songCounter: 0, // Geçerli şarkı sayısı
triggerCount: 10, // Kaç şarkıda bir anons
currentAnnouncementIndex: 0 // Rotation indexi
},
// 30 saniye dinleme sonrası
onTrackHit() {
if (this.announcementSystem.isEnabled && !this.announcementSystem.isPaused) {
this.announcementSystem.songCounter++;
// Backend'e de bildir (sync için)
fetch('/api/announcement/increment-counter', { method: 'POST' });
}
},
// Şarkı bittiğinde
onSongEnded() {
if (this.shouldPlayAnnouncement()) {
this.playNextAnnouncement();
} else {
this.playNextSong();
}
},
shouldPlayAnnouncement() {
return this.announcementSystem.isEnabled
&& !this.announcementSystem.isPaused
&& this.announcementSystem.songCounter >= this.announcementSystem.triggerCount;
},
async playNextAnnouncement() {
const response = await fetch('/api/announcement/next');
const announcement = await response.json();
// Anons çal
this.currentTrack = {
type: 'announcement',
title: announcement.title,
audio_url: announcement.audio_url
};
// UI'da "ANONS" badge göster
this.isPlayingAnnouncement = true;
// Anons bitince
this.audio.onended = () => {
this.isPlayingAnnouncement = false;
this.announcementSystem.songCounter = 0; // Sıfırla
this.playNextSong(); // Normal akışa dön
};
}
UI Tasarımı
Admin Panel - Anons Yönetimi
Anonslar
Yılbaşı Kampanyası
45 saniye • Yüklenme: 30 Ara 2025
Genel Duyuru
30 saniye • Yüklenme: 28 Ara 2025
Kurumsal Panel - Anons Ayarları (Ana Şube)
Min: 5 şarkı, Max: 20 şarkı
Şube Kontrolü - Player İçi Buton
Anons Sistemi
Sonraki anons: 7 şarkı sonra
* Bu kontrol sadece bu şubeyi etkiler. Ana şube ayarı değişmez.
Anons Çalarken - Player Görünümü
Yılbaşı Kampanyası
Şirket Duyurusu
0:23 / 0:45
Atlanamaz
Yapılacaklar Listesi
Veritabanı & Model
- • Migration: 4 yeni tablo oluştur
- • Model: MuzibuAnnouncement, CorporateAnnouncementSetting, BranchAnnouncementStatus, AnnouncementPlay
- • İlişkiler: belongsTo, hasMany tanımla
Dosyalar: Modules/Muzibu/database/migrations/, Modules/Muzibu/app/Models/
Admin Panel (Muzibu)
- • Controller: AnnouncementController (CRUD)
- • Livewire: AnnouncementManagement (drag & drop sıralama)
- • View: admin/announcements/index.blade.php, manage.blade.php
- • Dosya yükleme: MP3/WAV desteği
Dosyalar: Modules/Muzibu/app/Http/Controllers/Admin/, resources/views/admin/
Kurumsal Panel (Ana Şube)
- • CorporateFrontController'a anons ayarları ekle
- • View: corporate/announcement-settings.blade.php
- • API: /api/corporate/announcement-settings (GET/PUT)
Dosyalar: Modules/Muzibu/app/Http/Controllers/Front/CorporateFrontController.php
Player Entegrasyonu
- • muzibu-store.js: announcementSystem state ekle
- • player-core.js: onTrackHit'e sayaç logic ekle
- • player-core.js: onSongEnded'a anons trigger ekle
- • UI: Anons badge, durdur/devam butonu
Dosyalar: public/themes/muzibu/js/player/, public/themes/muzibu/js/muzibu-store.js
API Endpoints
- • AnnouncementApiController: next, track-play, increment-counter
- • Routes: /api/announcement/* endpoints
- • Middleware: Corporate authentication check
Dosyalar: Modules/Muzibu/app/Http/Controllers/Api/, Modules/Muzibu/routes/api.php
Test & Deploy
- • Migration çalıştır (tenant)
- • Admin'den test anonsu yükle
- • Player'da 10 şarkı dinle, anons tetiklenme testi
- • Şube durdur/devam testi
- • npm run prod + cache temizle
Karar Bekleyen Konular
1. Anons Atlanabilir mi?
2. Anons Süresi Limiti
Maksimum anons süresi ne olmalı? (60sn? 90sn? 120sn?)
3. Gece Saatleri
Gece saatlerinde (23:00-07:00) anons çalmasın mı?
4. Anons Dosya Boyutu
Maksimum dosya boyutu ne olmalı? (5MB? 10MB?)