A high-performance CLI tool for downloading media from Telegram
Project description
๐ Telegram Media Downloader - tgdl
A powerful, high-performance CLI tool for downloading media from Telegram channels, groups, bot chats, and messages. Built with async/await for 5-10x faster downloads with smart filters and progress tracking.
โจ Features
- โก Blazing Fast - Parallel async downloads (5-10x faster than traditional tools)
- ๐ฏ Smart Filters - Download by media type (photos, videos, audio, documents)
- ๐ Size Control - Filter by file size (min/max)
- ๐ Auto-Resume - Automatically skips already downloaded files
- ๐ Progress Bars - Real-time progress with download statistics
- ๐พ Session Management - Secure login with saved sessions
- ๐ก๏ธ Error Handling - Graceful error recovery and interruption handling
- โ๏ธ Configurable - Customize parallel downloads and output directories
- ๐จ User-Friendly - Beautiful CLI interface with colors and emojis
๐ฆ Installation
From PyPI (Recommended)
pip install tgdl
From Source
git clone https://github.com/kavidu-dilhara/tgdl.git
cd tgdl
pip install -e .
๐ Quick Start
1. Get API Credentials
Get your Telegram API credentials from https://my.telegram.org/apps
2. Login
tgdl login
Enter your API ID, API Hash, and phone number when prompted.
3. List Your Channels/Groups/Bots
# List all channels
tgdl channels
# List all groups
tgdl groups
# List all bot chats
tgdl bots
4. Download Media
# Download all media from a channel
tgdl download -c CHANNEL_ID
# Download only photos and videos
tgdl download -c CHANNEL_ID -p -v
# Download from a bot chat
tgdl download -b BOT_ID -d
# Download with file size limit
tgdl download -g GROUP_ID --max-size 100MB
# Download from a message link
tgdl download-link https://t.me/channel/123
๐ Usage
Commands
tgdl login
Login to Telegram and save session.
tgdl login
tgdl channels
List all channels you're a member of.
tgdl channels
tgdl groups
List all groups you're a member of.
tgdl groups
tgdl bots
List all bot chats.
tgdl bots
tgdl download
Download media from a channel, group, or bot chat with filters.
tgdl download [OPTIONS]
Options:
-c, --channel INTEGER Channel ID to download from
-g, --group INTEGER Group ID to download from
-b, --bot INTEGER Bot chat ID to download from
-p, --photos Download only photos
-v, --videos Download only videos
-a, --audio Download only audio files
-d, --documents Download only documents
--max-size TEXT Maximum file size (e.g., 100MB, 1GB)
--min-size TEXT Minimum file size (e.g., 1MB, 10KB)
--limit INTEGER Maximum number of files to download
--concurrent INTEGER Number of parallel downloads (default: 5)
-o, --output TEXT Output directory (default: downloads)
-h, --help Show this message and exit
tgdl download-link
Download media from a single message link.
tgdl download-link LINK [OPTIONS]
Options:
-p, --photos Accept only photos
-v, --videos Accept only videos
-a, --audio Accept only audio files
-d, --documents Accept only documents
--max-size TEXT Maximum file size
--min-size TEXT Minimum file size
-o, --output TEXT Output directory
-h, --help Show this message and exit
tgdl status
Check authentication status and configuration.
tgdl status
Shows:
- Authentication status
- User information (name, ID, username)
- Config file locations
- API credentials (masked)
tgdl logout
Logout from Telegram and remove session.
tgdl logout
This will:
- Remove your local session file
- Delete stored API credentials
- Optionally clear download progress
tgdl --version
Show version information.
tgdl --version
๐ File Organization
Downloaded files are organized as follows:
downloads/
โโโ entity_1234567890/ # Channel/Group ID
โ โโโ file1.jpg
โ โโโ file2.mp4
โ โโโ ...
โโโ single_downloads/ # Files from download-link
โโโ video.mp4
โโโ ...
โ๏ธ Configuration
Configuration is stored in ~/.tgdl/:
config.json- API credentials and settingstgdl.session- Telegram session (encrypted)progress.json- Download progress tracker
๐ฏ Requirements
- Python 3.7 or higher
- Active Telegram account
- Telegram API credentials (API ID & API Hash from https://my.telegram.org/apps)
๐ Performance
- 5-10x faster than traditional downloaders
- Parallel downloads with configurable concurrency
- Smart caching - skips already downloaded files
- Optimized I/O - async operations throughout
Benchmarks
| Files | Sequential | tgdl | Speed Up |
|---|---|---|---|
| 10 | ~5 min | ~1 min | 5x |
| 100 | ~45 min | ~8 min | 5.6x |
| 1000 | ~7.5 hrs | ~1.3 hrs | 5.8x |
Results vary based on internet speed and file sizes
๐ ๏ธ Troubleshooting
Rate Limiting
If you get rate limited by Telegram, reduce concurrency:
tgdl download -c CHANNEL_ID --concurrent 2
Authentication Issues
If you have authentication problems:
# Check status
tgdl status
# Login again
tgdl login
Session Expired
Delete session and login again:
# On Linux/Mac
rm ~/.tgdl/tgdl.session
# On Windows
del %USERPROFILE%\.tgdl\tgdl.session
# Then login
tgdl login
๐จ Screenshots
$ tgdl download -c 1234567890 -p -v
๐ฅ Download Settings
Entity: Channel 1234567890
Media types: photo, video
Parallel downloads: 5
Output: downloads
Found 123 already downloaded files, skipping...
Fetching messages from entity 1234567890...
Found 45 media files to download
Downloading: 100%|โโโโโโโโโโโโโโโโ| 45/45 [02:15<00:00, 3.33file/s]
โ Successfully downloaded 45 files!
Files saved to: downloads/entity_1234567890
๐ Download complete! 45 files downloaded.
๏ฟฝ Advanced Usage
Media Type Filters
Combine multiple media type filters:
# Photos and videos only
tgdl download -c 1234567890 -p -v
# Only documents
tgdl download -c 1234567890 -d
# Only audio files
tgdl download -c 1234567890 -a
File Size Filters
Control file sizes:
# Download files between 1MB and 100MB
tgdl download -c 1234567890 --min-size 1MB --max-size 100MB
# Only large files (>50MB)
tgdl download -c 1234567890 --min-size 50MB
# Only small files (<10MB)
tgdl download -c 1234567890 --max-size 10MB
Limit Number of Files
# Download only first 10 files
tgdl download -c 1234567890 --limit 10
# Download first 100 videos
tgdl download -c 1234567890 -v --limit 100
Custom Output Directory
# Save to custom directory
tgdl download -c 1234567890 -o /path/to/downloads
# Use relative path
tgdl download -c 1234567890 -o ./my_downloads
Performance Tuning
# Slow but safe (good for rate limits)
tgdl download -c 1234567890 --concurrent 2
# Balanced (default)
tgdl download -c 1234567890 --concurrent 5
# Fast (if you have good internet)
tgdl download -c 1234567890 --concurrent 10
๐ Security & Privacy
- API credentials stored securely in
~/.tgdl/config.json - Session file encrypted by Telethon
- No data sent to third parties
- All downloads happen directly from Telegram servers
๐ค Contributing
Contributions are welcome! Please feel free to submit a Pull Request.
- Fork the repository
- Create your feature branch (
git checkout -b feature/AmazingFeature) - Commit your changes (
git commit -m 'Add some AmazingFeature') - Push to the branch (
git push origin feature/AmazingFeature) - Open a Pull Request
๐ License
This project is licensed under the MIT License - see the LICENSE file for details.
โ ๏ธ Disclaimer
This tool is for personal use only. Please respect:
- Telegram's Terms of Service
- Copyright laws
- Content creators' rights
- Rate limits and server resources
๐ Links
- ๐ Documentation - Complete guide and API reference
- PyPI Package
- GitHub Repository
- Issue Tracker
- Telegram API Documentation
- Telethon Documentation
๐ฌ Support
If you have questions or need help:
- Open an issue on GitHub
- Check existing issues for solutions
Made with โค๏ธ by kavidu-dilhara
Happy Downloading! ๐
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file tgdl-1.2.1.tar.gz.
File metadata
- Download URL: tgdl-1.2.1.tar.gz
- Upload date:
- Size: 24.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d5b310ad5a46658aa3c1d06ac19eceef05bf2995bcdac86f1c349f4228a74e06
|
|
| MD5 |
31366b9bc82b6b3a9a43e5167c3c6e7d
|
|
| BLAKE2b-256 |
99381585f355ef56835955f6046022098b8f871b3f6553dff1946defa54e8359
|
Provenance
The following attestation bundles were made for tgdl-1.2.1.tar.gz:
Publisher:
release.yml on kavidu-dilhara/tgdl
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
tgdl-1.2.1.tar.gz -
Subject digest:
d5b310ad5a46658aa3c1d06ac19eceef05bf2995bcdac86f1c349f4228a74e06 - Sigstore transparency entry: 1293740804
- Sigstore integration time:
-
Permalink:
kavidu-dilhara/tgdl@fe409ee016aa197aa2c51d385228c6f90d3ce751 -
Branch / Tag:
refs/tags/1.2.1 - Owner: https://github.com/kavidu-dilhara
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@fe409ee016aa197aa2c51d385228c6f90d3ce751 -
Trigger Event:
push
-
Statement type:
File details
Details for the file tgdl-1.2.1-py3-none-any.whl.
File metadata
- Download URL: tgdl-1.2.1-py3-none-any.whl
- Upload date:
- Size: 22.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5623b5327062dae9d5169343f93429250f17f8db7827d52c39e65814dfb678fb
|
|
| MD5 |
82f8ebbc78db167d0784818fa398abd4
|
|
| BLAKE2b-256 |
438990a8d0ce344d5347ccb2fb20d9854530027e02271507f31291ef6c1f1718
|
Provenance
The following attestation bundles were made for tgdl-1.2.1-py3-none-any.whl:
Publisher:
release.yml on kavidu-dilhara/tgdl
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
tgdl-1.2.1-py3-none-any.whl -
Subject digest:
5623b5327062dae9d5169343f93429250f17f8db7827d52c39e65814dfb678fb - Sigstore transparency entry: 1293740880
- Sigstore integration time:
-
Permalink:
kavidu-dilhara/tgdl@fe409ee016aa197aa2c51d385228c6f90d3ce751 -
Branch / Tag:
refs/tags/1.2.1 - Owner: https://github.com/kavidu-dilhara
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@fe409ee016aa197aa2c51d385228c6f90d3ce751 -
Trigger Event:
push
-
Statement type: