e8120b952985210f7907459fc15a74257f6cffcc
- Always show the first nonzero progress update so users don't see 0% for extended periods on slow downloads or fragment-based downloads - Keep 5% throttle for subsequent updates to avoid excessive API calls - Add readProgress summary logging (lines, matches, stderr length) - Fix progressKeyboard not being updated until progress >= 5%
uptodownbot
Telegram bot for downloading media from any site yt-dlp supports.
Features
- Download audio, video, or combined audio+video from YouTube, Spotify, SoundCloud, Vimeo, and hundreds more
- Thumbnail preview with metadata (title, uploader, duration) before download
- Audio-only sites (Spotify, SoundCloud, YouTube Music, etc.) auto-detect and skip to audio quality selection
- Multi-step format selection: media type, quality, language, container
- Playlist support with paginated entry selection (10 per page, select all, confirm with count)
- Download progress updates (every 5% with speed and ETA)
- Cancel downloads at any time (terminates yt-dlp process)
- Per-user quota system (daily, weekly, monthly)
- User preferences (default quality, container, language)
- Download history
- Configurable file size limit
- Cookies support for age-restricted content
- Proxy support via HTTP_PROXY/HTTPS_PROXY env vars
- Webhook and polling modes
- SQLite database for persistence
Commands
/start- Show main menu/download- Prompt for a download URL/settings- Open settings/help- Show help text/history- View download history
You can also send a URL directly to start downloading immediately.
Configuration
Copy .env.example to .env and configure:
| Variable | Default | Description |
|---|---|---|
BOT_TOKEN |
(required) | Telegram Bot API token |
HTTP_PROXY |
empty | Outbound HTTP proxy |
HTTPS_PROXY |
empty | Outbound HTTPS proxy |
DB_PATH |
data/uptodown.db |
SQLite database path |
DOWNLOAD_DIR |
/tmp/uptodown |
Temporary download directory |
MAX_FILE_SIZE_MB |
2000 |
Maximum upload file size in MB |
COOKIES_FILE |
empty | Path to cookies.txt for auth |
TZ |
UTC |
Timezone |
BOT_ALLOWED_USERS |
empty | Comma-separated allowed user IDs |
BOT_WEBHOOK_URL |
empty | Webhook URL (omit for polling) |
BOT_LISTEN |
:8080 |
Webhook listen address |
BOT_TLS_CERT |
empty | TLS certificate path |
BOT_TLS_KEY |
empty | TLS key path |
Running
Polling mode (default)
cp .env.example .env
# edit .env with your BOT_TOKEN
make run-dev
Webhook mode
export BOT_WEBHOOK_URL=https://your.domain.com/webhook
make run-dev
Docker
make docker-run
Development
make build # build binary
make test # run tests
make fmt # format code
make vet # vet code
make check # fmt + vet
Description
Languages
Go
99%
Dockerfile
0.7%
Makefile
0.3%