Planlama 31 Aralık 2025

Muzibu Anons Sistemi

Kurumsal hesaplar için şarkı arası anons/reklam yayın sistemi

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

1 Anons Aralığı

10 şarkıda bir anons (ana şube ayarlayabilir: 5-20 arası)

2 Geçerli Dinleme

Şarkı 30 saniye dinlenirse 1 şarkı sayılır

3 Şube Kontrolü

Her şube anonsu durdurabilir/devam ettirebilir

4 Çoklu Anons

Muzibu admin panelinden birden fazla anons yüklenebilir

5 Sıralı Çalma

Anonslar sırayla (rotation) çalar

6 Kurumsal Only

Sadece kurumsal aboneliklerde aktif

Sistem Akışı

Şarkı 1
Şarkı 2
...
Şarkı 10
ANONS #1
Şarkı 11
...
Şarkı 20
ANONS #2
Normal Şarkı (30sn+ = geçerli)
Anons (sıralı rotation)

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)

GET /admin/announcements - Anons listesi
POST /admin/announcements - Yeni anons yükle
PUT /admin/announcements/{id} - Anons güncelle
DEL /admin/announcements/{id} - Anons sil
POST /admin/announcements/reorder - Sıralama değiştir

Kurumsal Panel (Ana Şube)

GET /api/corporate/announcement-settings - Mevcut ayarlar
PUT /api/corporate/announcement-settings - Ayarları güncelle
GET /api/corporate/announcement-stats - İstatistikler

Şube Kontrolü (Tüm Şubeler)

POST /api/announcement/pause - Anonsu durdur
POST /api/announcement/resume - Anonsu devam ettir
GET /api/announcement/status - Şube durumu

Player API

GET /api/announcement/next - Sıradaki anons (rotation)
POST /api/announcement/track-play - Anons çalındı bildir
POST /api/announcement/increment-counter - Şarkı sayacını artır

Player Entegrasyonu

Mevcut Akış

  1. 1. Şarkı başlar
  2. 2. 30sn sonra trackHit() çağrılır
  3. 3. Şarkı biter → Sonraki şarkı

Yeni Akış (Anonslu)

  1. 1. Şarkı başlar
  2. 2. 30sn sonra trackHit() + incrementAnnouncementCounter()
  3. 3. Şarkı biter
  4. 4. checkAnnouncementTrigger() - Sayaç = 10 mi?
  5. 5a. Hayır → Sonraki şarkı
  6. 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

1

Yılbaşı Kampanyası

45 saniye • Yüklenme: 30 Ara 2025

Aktif
2

Genel Duyuru

30 saniye • Yüklenme: 28 Ara 2025

Aktif

Kurumsal Panel - Anons Ayarları (Ana Şube)

10

Min: 5 şarkı, Max: 20 şarkı

Tüm şubelerde aktif

Ş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ü

ANONS

Yılbaşı Kampanyası

Şirket Duyurusu

0:23 / 0:45

Atlanamaz

Yapılacaklar Listesi

1

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/

2

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/

3

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

4

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

5

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

6

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?)