# 🎙 Radio Sound Bar – Einrichtung (eigener MySQL-Server)

## Voraussetzungen

- Webserver mit **PHP 8.0+** und **MySQL 5.7+ / MariaDB 10.3+**
- z.B. XAMPP (lokal), Plesk, cPanel, eigener VPS

---

## Schritt 1: Datenbank anlegen

In phpMyAdmin oder MySQL-Konsole:

```sql
CREATE DATABASE radio_soundbar CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
```

---

## Schritt 2: Tabellen anlegen

SQL in phpMyAdmin → SQL-Tab einfügen und ausführen:

```sql
USE radio_soundbar;

-- BENUTZER
CREATE TABLE IF NOT EXISTS rsb_users (
  id VARCHAR(36) PRIMARY KEY,
  username VARCHAR(80) UNIQUE NOT NULL,
  password_hash VARCHAR(255) NOT NULL,
  display_name VARCHAR(100) DEFAULT '',
  role ENUM('admin','moderator') DEFAULT 'moderator',
  active TINYINT(1) DEFAULT 1,
  created_at DATETIME DEFAULT NOW()
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- SESSIONS (für Login-Token)
CREATE TABLE IF NOT EXISTS rsb_sessions (
  id INT AUTO_INCREMENT PRIMARY KEY,
  token VARCHAR(64) UNIQUE NOT NULL,
  user_id VARCHAR(36) NOT NULL,
  expires_at DATETIME NOT NULL,
  created_at DATETIME DEFAULT NOW()
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- NEWS
CREATE TABLE IF NOT EXISTS rsb_news (
  id VARCHAR(36) PRIMARY KEY,
  title VARCHAR(255) NOT NULL,
  body TEXT NOT NULL,
  category VARCHAR(80) DEFAULT 'News',
  emoji VARCHAR(10) DEFAULT '📰',
  display_date VARCHAR(80) DEFAULT '',
  author VARCHAR(80) DEFAULT '',
  published TINYINT(1) DEFAULT 1,
  pinned TINYINT(1) DEFAULT 0,
  sort_order INT DEFAULT 99,
  created_at DATETIME DEFAULT NOW()
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- SENDEPLAN (neu: time_from, time_to, schedule_date)
CREATE TABLE IF NOT EXISTS rsb_schedule (
  id            VARCHAR(36)  PRIMARY KEY,
  time_from     VARCHAR(10)  NOT NULL DEFAULT '',
  time_to       VARCHAR(10)  NOT NULL DEFAULT '',
  show_name     VARCHAR(150) NOT NULL,
  host          VARCHAR(100) DEFAULT '',
  day_type      VARCHAR(30)  DEFAULT 'täglich',
  schedule_date DATE         NULL,
  description   VARCHAR(255) DEFAULT '',
  active        TINYINT(1)   DEFAULT 1,
  created_at    DATETIME     DEFAULT NOW()
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- ⚠️ Falls die Tabelle bereits existiert (Altdaten), diese Migration ausführen:
-- ALTER TABLE rsb_schedule ADD COLUMN time_from VARCHAR(10) NOT NULL DEFAULT '' AFTER id;
-- ALTER TABLE rsb_schedule ADD COLUMN time_to   VARCHAR(10) NOT NULL DEFAULT '' AFTER time_from;
-- ALTER TABLE rsb_schedule ADD COLUMN schedule_date DATE NULL AFTER day_type;
-- UPDATE rsb_schedule SET time_from = time_slot WHERE time_from = '';
-- (Danach kann time_slot gelöscht werden, muss aber nicht)

-- CHARTS
CREATE TABLE IF NOT EXISTS rsb_charts (
  id VARCHAR(36) PRIMARY KEY,
  track VARCHAR(200) NOT NULL,
  artist VARCHAR(200) NOT NULL,
  cover_emoji VARCHAR(10) DEFAULT '🎵',
  trend ENUM('up','down','same') DEFAULT 'same',
  position INT DEFAULT 1,
  created_at DATETIME DEFAULT NOW()
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- WÜNSCHE & GRÜSSE
CREATE TABLE IF NOT EXISTS rsb_wishes (
  id VARCHAR(36) PRIMARY KEY,
  sender_name VARCHAR(100) NOT NULL,
  wish_song VARCHAR(200) DEFAULT '',
  greet_to VARCHAR(100) DEFAULT '',
  message TEXT NOT NULL,
  approved TINYINT(1) DEFAULT 0,
  approved_by VARCHAR(80) DEFAULT '',
  created_at DATETIME DEFAULT NOW()
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- WEBSITE EINSTELLUNGEN
CREATE TABLE IF NOT EXISTS rsb_settings (
  `key` VARCHAR(80) PRIMARY KEY,
  value TEXT NOT NULL,
  updated_at DATETIME DEFAULT NOW()
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- STREAM
CREATE TABLE IF NOT EXISTS rsb_stream (
  id INT PRIMARY KEY DEFAULT 1,
  stream_url VARCHAR(500) DEFAULT '',
  stream_name VARCHAR(150) DEFAULT 'Radio Sound Bar – Live',
  genre VARCHAR(80) DEFAULT 'Mixed',
  backup_url VARCHAR(500) DEFAULT '',
  az_public_url VARCHAR(500) DEFAULT '',
  updated_at DATETIME DEFAULT NOW()
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- Falls Tabelle schon existiert, Spalte nachträglich hinzufügen:
-- ALTER TABLE rsb_stream ADD COLUMN az_public_url VARCHAR(500) DEFAULT '' AFTER backup_url;

-- LINKS, BANNER & TOPLISTEN
CREATE TABLE IF NOT EXISTS rsb_links (
  id VARCHAR(36) PRIMARY KEY,
  type ENUM('link','banner','html') DEFAULT 'link',
  title VARCHAR(200) NOT NULL,
  url VARCHAR(500) DEFAULT '',
  subtitle VARCHAR(255) DEFAULT '',
  emoji VARCHAR(10) DEFAULT '🔗',
  image_url VARCHAR(500) DEFAULT '',
  html_code TEXT DEFAULT '',
  sort_order INT DEFAULT 99,
  active TINYINT(1) DEFAULT 1,
  created_at DATETIME DEFAULT NOW()
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- Falls Tabelle schon existiert, fehlende Spalten nachrüsten:
-- ALTER TABLE rsb_links MODIFY COLUMN type ENUM('link','banner','html') DEFAULT 'link';
-- ALTER TABLE rsb_links ADD COLUMN html_code TEXT DEFAULT '' AFTER image_url;

-- ============================================================
-- STANDARD-DATEN
-- ============================================================

-- Admin-Account (Passwort: soundbar2025 – bitte sofort ändern!)
INSERT IGNORE INTO rsb_users (id, username, password_hash, display_name, role)
VALUES
  (UUID(), 'admin',     'soundbar2025', 'Administrator', 'admin'),
  (UUID(), 'moderator', 'mod123',       'Moderator',     'moderator');

-- Stream initialisieren
INSERT IGNORE INTO rsb_stream (id, stream_name) VALUES (1, 'Radio Sound Bar – Live');

-- Standard-Einstellungen
INSERT INTO rsb_settings (`key`, value) VALUES
  ('ticker',      '🎵 Willkommen bei Radio Sound Bar! &nbsp;|&nbsp; 📱 Wunschsong? Scrolle nach unten! &nbsp;|&nbsp; 🎤 Immer live – immer gut!'),
  ('subtitle',    'Musik, News & mehr – 24/7 live. Für alle, die mehr wollen als Mainstream.'),
  ('impressum',   'Radio Sound Bar\nMusterstraße 1\n60311 Frankfurt am Main'),
  ('about',       'Radio Sound Bar ist dein digitales Zuhause für die beste Musik. Wir senden live, rund um die Uhr, mit Herz und Leidenschaft.'),
  ('email',       'kontakt@radiosoundbar.de'),
  ('ts3_address', ''),
  ('ts3_port',    '9987'),
  ('chat_url',    ''),
  ('chat_label',  'Chat betreten')
ON DUPLICATE KEY UPDATE `key`=`key`;

-- Demo-Sendeplan
INSERT IGNORE INTO rsb_schedule (id, time_from, time_to, show_name, host, day_type) VALUES
  (UUID(), '06:00', '09:00', 'Guten Morgen Frankfurt', 'Morgen-Team',    'täglich'),
  (UUID(), '09:00', '12:00', 'Morgenshow',             'Sound Bar Team', 'täglich'),
  (UUID(), '12:00', '15:00', 'Mittagsbeat',            'DJ Marco',       'täglich'),
  (UUID(), '15:00', '18:00', 'Nachmittagsmix',         'Lena K.',        'täglich'),
  (UUID(), '18:00', '21:00', 'Feierabend-Session',     'Chris B.',       'täglich'),
  (UUID(), '21:00', '00:00', 'Late Night Vibes',       'Night-Crew',     'täglich');

-- Demo-Charts
INSERT IGNORE INTO rsb_charts (id, track, artist, cover_emoji, trend, position) VALUES
  (UUID(), 'Flowers',        'Miley Cyrus',  '💜', 'up',   1),
  (UUID(), 'Blinding Lights','The Weeknd',   '🔥', 'same', 2),
  (UUID(), 'Levitating',     'Dua Lipa',     '🌊', 'up',   3),
  (UUID(), 'As It Was',      'Harry Styles', '⚡', 'down', 4),
  (UUID(), 'Starboy',        'The Weeknd',   '🎹', 'up',   5);

-- Demo-News
INSERT IGNORE INTO rsb_news (id, title, body, category, emoji, display_date, pinned, sort_order) VALUES
  (UUID(), 'Radio Sound Bar ist jetzt online!',   'Willkommen auf unserer neuen Homepage! Hier findet ihr News, Sendeplan, Wunsch & Gruß und vieles mehr.',                             'Radio News', '📻', 'Heute',     1, 1),
  (UUID(), 'Stadtfest Frankfurt – Wir sind live!', 'Beim diesjährigen Stadtfest Frankfurt überträgt Radio Sound Bar live vom Römerberg. Merkt euch den Termin!', 'Events',     '🎪', 'Demnächst', 0, 2);
```

---

## Schritt 3: api.php konfigurieren

Öffne `api.php` und trage deine Datenbankdaten ein:

```php
define('DB_HOST', 'localhost');       // meist localhost
define('DB_NAME', 'radio_soundbar'); // dein Datenbankname
define('DB_USER', 'dein_user');      // MySQL-Benutzer
define('DB_PASS', 'dein_passwort'); // MySQL-Passwort
define('DB_PORT', '3306');           // Standard-Port

// Sicherheits-Secret (bitte ändern!)
define('API_SECRET', 'rsb_secret_2025_change_me');
```

---

## Schritt 4: Dateien hochladen

Lade **alle Dateien** in denselben Ordner auf deinem Webserver:

```
/public_html/radio/
  ├── index.html
  ├── admin.html
  ├── config.js
  ├── nav.js
  ├── api.php        ← PHP-Backend
  ├── login.php      ← Login-Endpoint
  ├── ueber-uns.html
  ├── kontakt.html
  ├── impressum.html
  ├── datenschutz.html
  └── style.css      (für den ET-Chat)
```

---

## Schritt 5: Fertig! 🎉

Rufe `https://deine-domain.de/radio/index.html` auf.

**Standard-Logins:**
- Admin: `admin` / `soundbar2025`
- Moderator: `moderator` / `mod123`

⚠️ **Bitte nach dem ersten Login sofort das Passwort ändern!**
(Admin-Panel → Passwort-Symbol oben rechts)

---

## Häufige Probleme

| Problem | Lösung |
|---|---|
| "Datenbankverbindung fehlgeschlagen" | DB-Zugangsdaten in api.php prüfen |
| "401 Nicht autorisiert" bei Admin-Aktionen | Eingeloggt? Session abgelaufen? |
| Leere Seiten | Browser-Konsole (F12) prüfen, api.php-Pfad in config.js korrekt? |
| CORS-Fehler | Dateien müssen auf demselben Server wie api.php liegen |
| PHP-Fehler 500 | PHP-Fehlerlog prüfen; PHP 8.0+ nötig |

---

## Sicherheitshinweise

- `api.php` direkt im Browser aufrufen zeigt keine sensiblen Daten (durch Table-Whitelist geschützt)
- Passwörter werden beim ersten Login automatisch auf **bcrypt** gehasht
- Für Produktivbetrieb: HTTPS verwenden!
