Radio: Webradio im Sprachkanal, 44 Sender zum Durchschalten
/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>
This commit is contained in:
@@ -2961,3 +2961,40 @@ button.with-icon, a.with-icon { justify-content: center; }
|
||||
.mod-version, .mod-size { grid-area: meta; text-align: left; min-width: 0; }
|
||||
.mod-version::after { content: ' ·'; }
|
||||
}
|
||||
|
||||
/* ── RADIO-SENDER (Panel) ──────────────────────────── */
|
||||
/* 44 Sender sind 3300 px — ohne Deckel schiebt die Liste den halben
|
||||
Community-Bereich aus dem Bild. Gemessen im Panel, nicht geschätzt. */
|
||||
.radio-list {
|
||||
display: flex; flex-direction: column; gap: 1px; margin-bottom: 1.5rem;
|
||||
max-height: 26rem; overflow-y: auto;
|
||||
border: 1px solid var(--border);
|
||||
}
|
||||
.radio-list::-webkit-scrollbar { width: 8px; }
|
||||
.radio-list::-webkit-scrollbar-thumb { background: var(--border); }
|
||||
/* Die Config-Seite ist zweispaltig — ein Abschnitt ist rund 480 px breit,
|
||||
nicht die volle Seite. Mit vier Spalten blieben für Name und Adresse
|
||||
96 px übrig; gemessen, nicht geschätzt. Deshalb schmale Knöpfe. */
|
||||
.radio-row {
|
||||
display: grid; align-items: center; gap: .6rem;
|
||||
grid-template-columns: auto minmax(0, 1fr) auto;
|
||||
padding: .6rem .7rem; background: var(--bg2);
|
||||
border-left: 2px solid transparent;
|
||||
}
|
||||
.radio-actions { display: flex; gap: .35rem; }
|
||||
.radio-actions .btn { padding: .3rem .55rem; font-size: .6rem; }
|
||||
.radio-row:hover { background: var(--bg3); border-left-color: var(--neon); }
|
||||
.radio-emoji { font-size: 1.2rem; line-height: 1; }
|
||||
.radio-info { min-width: 0; }
|
||||
.radio-name { display: block; color: var(--text); }
|
||||
.radio-url {
|
||||
display: block; font-family: var(--mono); font-size: .62rem; color: var(--muted2);
|
||||
overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
|
||||
}
|
||||
.radio-form { border-top: 1px solid var(--border); padding-top: 1.2rem; }
|
||||
/* Emoji und Reihenfolge sind beide schmal — nebeneinander statt zwei
|
||||
halbleere Zeilen, aber auf dem Handy untereinander. */
|
||||
.radio-form-row { display: grid; grid-template-columns: 1fr 1fr; gap: 1rem; }
|
||||
@media (max-width: 560px) {
|
||||
.radio-form-row { grid-template-columns: 1fr; }
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user