diff --git a/Dockerfile b/Dockerfile index 24dd8c3..3d11cbe 100644 --- a/Dockerfile +++ b/Dockerfile @@ -26,7 +26,10 @@ ENV NODE_ENV=production ENV PORT=8080 ENV SOUNDS_DIR=/data/sounds -RUN apt-get update && apt-get install -y ffmpeg && rm -rf /var/lib/apt/lists/* +RUN apt-get update && apt-get install -y ffmpeg curl ca-certificates && rm -rf /var/lib/apt/lists/* \ + && curl -L https://github.com/yt-dlp/yt-dlp/releases/latest/download/yt-dlp -o /usr/local/bin/yt-dlp \ + && chmod a+rx /usr/local/bin/yt-dlp \ + && yt-dlp --version || true COPY --from=server-build /app/server/dist ./server/dist COPY --from=server-build /app/server/node_modules ./server/node_modules diff --git a/server/src/index.ts b/server/src/index.ts index d4981e7..0980baa 100644 --- a/server/src/index.ts +++ b/server/src/index.ts @@ -625,7 +625,16 @@ app.post('/api/play-url', async (req: Request, res: Response) => { // Audio-Stream besorgen let stream: any; if (ytdl.validateURL(url)) { - stream = ytdl(url, { filter: 'audioonly', quality: 'highestaudio', highWaterMark: 1 << 25 }); + // Nutze ytdl-core, fallback auf yt-dlp bei HTTP Fehlern (410/403 etc.) + try { + stream = ytdl(url, { filter: 'audioonly', quality: 'highestaudio', highWaterMark: 1 << 25 }); + stream.on('error', (e: any) => { throw e; }); + } catch (e) { + console.warn('ytdl-core fehlgeschlagen, versuche yt-dlp:', e); + const yt = child_process.spawn('yt-dlp', ['-f', 'bestaudio', '-o', '-', url]); + yt.on('error', (err) => console.error('yt-dlp spawn error:', err)); + stream = yt.stdout; + } } else { // Fallback via yt-dlp, benötigt binary im Image/Host // wir nutzen stdout mit ffmpeg pipe