- jobs.controller: usun pole type z MessageEvent — onmessage w EventSource reaguje tylko na domyslne 'message', przez co front nie dostawal zdarzen - usun trial (health, compose, deploy.yml, UI, zmienne Gitea) - napisy: wybor osadzania w wideo lub osobnego pliku .srt (--convert-subs srt) Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Video & Sound Downloader Pro — wersja web (SPA)
Webowy odpowiednik desktopowego narzędzia Video & Sound Downloader Pro v6.5.6.
Łączy yt-dlp + FFmpeg w jednym panelu: pobieranie audio (MP3), wideo (MP4),
całych playlist oraz materiałów z Facebooka — bez wpisywania komend i bez ręcznej
konwersji. Backend: NestJS, frontend: React (Vite). Obraz portowany jest do
Dockera i wdrażany na https://videodownloader.naurecki.pl.
Aplikacja działa na bazie yt-dlp i obsługuje wszystkie platformy, które obsługuje yt-dlp (YouTube, YouTube Music, YouTube Shorts, Facebook, LinkedIn, ARTE TV i wiele innych).
Architektura
videodownloader/
├── apps/
│ ├── api/ # NestJS — joby pobierania, yt-dlp+ffmpeg, postęp SSE
│ │ ├── src/
│ │ └── Dockerfile # node + python3 + yt-dlp + ffmpeg
│ └── web/ # React + Vite (TS) — UI odwzorowany ze zrzutu
│ ├── src/
│ ├── nginx.conf # serwuje statyki + proxy /api (+ SSE bez buforowania)
│ └── Dockerfile
├── docker-compose.prod.yml # web → 127.0.0.1:8086, api wewnętrznie
└── .gitea/workflows/deploy.yml
Ruch publiczny: Apache (vhost videodownloader.naurecki.pl, SSL) → 127.0.0.1:8086
(kontener web, nginx) → statyki React + proxy /api → kontener api (NestJS).
Funkcje (odwzorowane ze zrzutu desktopowego)
- Pole Link z przyciskiem „wklej ze schowka”.
- 4 tryby:
MP3(pobierz dźwięk),MP4(pobierz wideo),PLAYLISTA(pobierz całą listę → ZIP),FACEBOOK(pobierz wideo). - Jakość / Format — lista zależna od trybu (MP3 320/256/192/128 kbps; MP4 2160/1440/1080/720/480p).
- Napisy — opcja pobrania dostępnych napisów (
--write-subs --embed-subs); zgodnie z oryginałem nie dotyczy automatycznie generowanych napisów YouTube. - Duży przycisk POBIERZ + STOP (przerwanie joba).
- Log na żywo (SSE) — komunikaty postępu, konwersji i scalania audio/wideo.
- Przyciski Wsparcie / O mnie.
Różnica względem wersji desktop: pole „Zapisz do” (ścieżka dyskowa Windows) w wersji web zostaje zastąpione pobraniem gotowego pliku przez przeglądarkę. Serwer przetwarza materiał w katalogu tymczasowym i po wysłaniu pliku sprząta po sobie (zgodnie z „bez zbędnych pozostałości i bez ręcznego sprzątania folderu”).
Rozwój lokalny
# API
cd apps/api && npm install && npm run start:dev # http://localhost:3000/api
# WEB
cd apps/web && npm install && npm run dev # http://localhost:5173
Wymaga lokalnie yt-dlp i ffmpeg w PATH (w produkcji są w obrazie).
Wdrożenie
Push do main → runner Gitea (.gitea/workflows/deploy.yml) buduje obrazy z
docker-compose.prod.yml i robi up -d na demonie Dockera serwera. Konfiguracja
reverse proxy + SSL — patrz DEPLOY.md.