# Deployment ## What's in the package ``` build/ ← compiled SvelteKit server (self-contained, no npm needed) scripts/ subtitle_to_markdown.py ← standalone subtitle converter CLI create_zip.py ← ZIP creation helper (used internally by the server) start.sh ← startup script README.md INSTALL.md ``` ## Prerequisites on the Linux server Node.js 18 or newer, Python 3, yt-dlp, and ffmpeg must be installed. ```bash # ffmpeg, Node.js, and Python via apt sudo apt install ffmpeg nodejs python3 # yt-dlp (latest release) sudo curl -L https://github.com/yt-dlp/yt-dlp/releases/latest/download/yt-dlp \ -o /usr/local/bin/yt-dlp sudo chmod +x /usr/local/bin/yt-dlp ``` ## Installation ```bash tar -xzf yt-dlf.tar.gz cd yt-dlf ``` ## Running ```bash ./start.sh ``` The server listens on port 3000 by default. Open `http://your-server:3000` in a browser. ## Environment variables Edit `start.sh` to configure the variables below, or pass them directly on the command line. ### General | Variable | Default | Purpose | |---|---|---| | `PORT` | `3000` | Port to listen on | | `ORIGIN` | `http://localhost:PORT` | Public URL of the server — set this in production | | `YTDLP_PATH` | `yt-dlp` | Full path to yt-dlp binary if not on PATH | | `FFMPEG_PATH` | `ffmpeg` | Full path to ffmpeg binary if not on PATH | | `DOWNLOAD_DIR` | `~/YouTube` | Directory where downloaded files are stored on the server | ### ZIP & Send mode When `ZIP_AND_SEND=true`, all downloaded files are packed into a ZIP and offered as a browser download instead of (only) being saved on the server. A random prefix is added to the temporary directory name to avoid collisions when multiple users download the same video simultaneously. | Variable | Default | Purpose | |---|---|---| | `ZIP_AND_SEND` | `false` | Enable ZIP & Send mode | | `ZIP_EXTRA_DIR` | _(none)_ | Optional directory whose files are added to every ZIP alongside the downloaded files. Subdirectory structure is preserved. | | `DELETE_AFTER_SEND` | `false` | Delete files from the server after the ZIP has been sent to the browser | | `DELETE_DELAY` | `0` | Seconds to wait before deleting files after the ZIP has been sent | ### Examples Custom port and public URL: ```bash PORT=8080 ORIGIN=http://myserver:8080 ./start.sh ``` ZIP & Send with cleanup after 60 seconds: ```bash ZIP_AND_SEND=true DELETE_AFTER_SEND=true DELETE_DELAY=60 ./start.sh ``` ZIP & Send with extra files bundled into every download: ```bash ZIP_AND_SEND=true ZIP_EXTRA_DIR=/opt/yt-dlf/extras ./start.sh ```