/radio holt den Bot in den Sprachkanal und postet eine Tafel: Auswahlmenue mit allen Sendern, Stopp, und ein Embed mit dem laufenden Titel, das sich alle 30 Sekunden selbst nachfuehrt. Der Titel kommt aus dem Icecast-Strom selbst (Icy-MetaData). Bewusst so und nicht ueber eine Sender-API: das funktioniert bei jedem Strom, den jemand eintraegt, und nicht nur bei den drei, die ich kenne. Leere Titel-Bloecke heissen "unveraendert", deshalb werden bis zu drei gelesen. Die Tonkette braucht keine Opus-Bibliothek: ffmpeg holt das MP3 und gibt direkt Ogg/Opus aus, prism-media packt nur noch aus. Gemessen: 600 Pakete in fuenf Sekunden. Sonst muesste @discordjs/opus mit ins Image, und das will gebaut werden. Neu im Image ist nur ffmpeg. 44 RauteMusik-Sender sind ab Werk eingetragen — dieselben, die im LS25 und ETS als Bordradio laufen. Die Liste ist nicht abgeschrieben, sondern gemessen: jede Adresse einzeln angefragt, der Name kommt aus icy-name. Doppelgaenger sind raus (deutschrap-charts und wackenradio liefern denselben Strom wie deutschrap und metal). Eingetragen wird einmal, solange die Liste leer ist — wer loescht, behaelt es geloescht. Ein Auswahlmenue fasst nur 25 Eintraege. Bei 44 Sendern haette ein Deckel die letzten 19 stillschweigend verschluckt; stattdessen mehrere Menues, benannt nach ihrem ersten und letzten Sender. Der Bot geht raus, wenn der Kanal leer ist, und kommt nach einem Neustart in den Kanal zurueck — sonst beendet jeder Deploy die Musik endgueltig. Kein YouTube. Genau daran sind Groovy und Rythm gestorben, und was davon uebrig ist, ist ein Dauerlauf gegen kaputte Extraktoren. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
38 lines
1.4 KiB
JavaScript
38 lines
1.4 KiB
JavaScript
// Einstiegspunkt — startet Discord-Bot, Webserver und den Wochen-Rückblick-Scheduler
|
|
import { startBot } from './bot/client.js';
|
|
import { startWebServer } from './web/server.js';
|
|
import { scheduleWeeklyRecap } from './bot/weekly-recap.js';
|
|
import { startWatchdog } from './bot/watchdog.js';
|
|
import { scheduleBackups } from './backup.js';
|
|
import { startServerMonitor } from './bot/server-monitor.js';
|
|
import { startLsFarm } from './bot/ls-farm.js';
|
|
import { startRadio } from './bot/radio.js';
|
|
import { startGiveaways } from './bot/giveaways.js';
|
|
import { startScheduledPosts } from './web/scheduled-posts.js';
|
|
import { startSocialNotify } from './bot/social-notify.js';
|
|
import { startBirthdays } from './bot/birthdays.js';
|
|
import { scheduleRepoBackups } from './repo-backup.js';
|
|
|
|
process.on('unhandledRejection', (error) => {
|
|
console.error('[main] Unhandled Rejection:', error);
|
|
});
|
|
|
|
try {
|
|
const client = await startBot();
|
|
await startWebServer(client);
|
|
scheduleWeeklyRecap(client);
|
|
startWatchdog(client);
|
|
scheduleBackups(client);
|
|
startServerMonitor(client);
|
|
startLsFarm(client);
|
|
startRadio(client);
|
|
startGiveaways(client);
|
|
startScheduledPosts(client);
|
|
startSocialNotify(client);
|
|
startBirthdays(client);
|
|
scheduleRepoBackups();
|
|
} catch (error) {
|
|
console.error('[main] Start fehlgeschlagen:', error);
|
|
process.exit(1);
|
|
}
|