YouTube als zweite Tonquelle: yt-dlp, Warteschlange, Abbild

Das Fundament, noch ohne Anbindung ans Radio.

yt-dlp holt selbst und schiebt rohe Bytes durch ein Rohr an ffmpeg. Der
bequemere Weg waere `-g` und die fertige Adresse -- der ist eine Falle:
googlevideo-Adressen laufen ab und haengen an der IP, die sie geholt hat.
Das schlaegt nach zehn Minuten zu und sieht dann aus wie ein Netzproblem.

Beim Stroemen nach stdout ist die Vorgabe von yt-dlp *mit* Bild; ohne ein
ausdrueckliches `-f bestaudio/best` laedt ein Tonstrom das ganze Video.
Nachgelesen im README der Fassung 2026.08.19.

stderr wird aufgehoben statt weggeworfen. Genau hier entsteht sonst der
Fehler, den niemand deuten kann: YouTube antwortet "Sign in to confirm",
yt-dlp bricht ab, der Bot sitzt still im Kanal. Die letzte ERROR-Zeile
geht ins Panel.

Gemessen am 28.08.2026 gegen echtes YouTube (yt-dlp 2026.08.19, von hier
aus, NICHT auf dem Zielhost): Einzelvideo, Suche und flache Playlist
liefern die erwarteten Felder, eine kaputte Video-ID meldet "Video
unavailable" und wird als Fehler durchgereicht statt als leere Liste.

Die Warteschlange steht in der Datenbank, nicht nur im Speicher -- ein
Deploy soll die Musik unterbrechen, nicht die Wuensche von fuenf Leuten
wegwerfen. Die YouTube-Tafel bekommt eine eigene Tabelle, weil
`radio_state` beim Stoppen geloescht wird und die Tafel das ueberleben
soll.

Nebenbei: der ffmpeg-Kommentar im Dockerfile beschrieb noch die alte
Ogg/Opus-Kette. Seit der Lautstaerkeregelung laeuft dort PCM.
This commit is contained in:
2026-08-28 13:26:05 +02:00
parent 19010e9fde
commit af16bc1b18
4 changed files with 563 additions and 2 deletions
+25
View File
@@ -384,3 +384,28 @@ export function radioLautstaerke() {
if (!Number.isFinite(roh)) return LAUT_VORGABE;
return Math.min(LAUT_MAX, Math.max(LAUT_MIN, Math.round(roh)));
}
/**
* Darf das Radio auch YouTube abspielen?
*
* Getrennt vom Modul-Schalter, und zwar mit Absicht: YouTube ist der Teil,
* der von aussen kaputtgehen kann (gesperrte Adressen, PO-Token, ein yt-dlp,
* das seit drei Wochen nicht aktualisiert wurde). Wenn das klemmt, soll man
* genau das abschalten können — und nicht das Radio mit, das davon nichts hat.
*
* Vorgabe: aus. Wer YouTube will, sagt es einmal.
*/
export function youtubeAn() {
return getSetting('radio_youtube_enabled') === '1';
}
/**
* Eigene Argumente für yt-dlp, roh wie eingetippt.
*
* Das Feld gibt es, weil YouTube seine Sperren schneller ändert, als hier ein
* Abbild neu gebaut wird: `--extractor-args`, ein anderer Client, eine
* Bandbreitenbremse. Ohne dieses Feld hiesse jede solche Anpassung Deploy.
*/
export function ytdlpArgumente() {
return getSetting('ytdlp_args') ?? '';
}