- Add thumbnail preview with metadata (title, uploader, duration) before download - Auto-detect audio-only sites (Spotify, SoundCloud, etc.) and skip type selection - Add /download command for feature parity with UI button - Fix yt-dlp defer bug: StatusFailed was overwritten to StatusCompleted - Fix handleURLInput using editText with msgID=0 (now uses sendWithKB) - Fix filename detection: use job ID prefix for reliable file finding - Fix double answerCb between handleBackStep and handleDownloadPrompt - Fix runDownload unused msgID parameter - Fix context for download goroutine (use context.Background) - Remove unused startWebhook h parameter - Remove dead buildToggleKeyboard function - Add formatBytes, formatDuration, formatLabelForDisplay tests - Add IsAudioOnlyContent, MediaType.String tests - Add repo integration tests (users, preferences, quotas, history, delete) - Add cmd/bot tests (parseAllowedUsers, env helpers) - Add edge case tests for progress parser - Add zero/negative safety guard in formatDuration - Add .gitea, TODO.md, opencode.json to gitignore
85 lines
2.9 KiB
Markdown
85 lines
2.9 KiB
Markdown
# 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)
|
|
|
|
```bash
|
|
cp .env.example .env
|
|
# edit .env with your BOT_TOKEN
|
|
make run-dev
|
|
```
|
|
|
|
### Webhook mode
|
|
|
|
```bash
|
|
export BOT_WEBHOOK_URL=https://your.domain.com/webhook
|
|
make run-dev
|
|
```
|
|
|
|
### Docker
|
|
|
|
```bash
|
|
make docker-run
|
|
```
|
|
|
|
## Development
|
|
|
|
```bash
|
|
make build # build binary
|
|
make test # run tests
|
|
make fmt # format code
|
|
make vet # vet code
|
|
make check # fmt + vet
|
|
```
|