Telegram Bot To ^hot^ Download Youtube Playlist Free -
The Ultimate Guide: Using a Telegram Bot to Download YouTube Playlists for Free
In the digital age, video content is king, but storage space is a luxury. Whether you want to listen to a study music mix offline, archive a tutorial series, or save a vlog compilation, downloading entire YouTube playlists has become a necessity.
However, traditional methods are clunky. Dedicated software often requires installation, risks malware, or bombards you with ads. Enter the solution: the Telegram bot.
Telegram, the cloud-based messaging app, has evolved into a powerful file-sharing ecosystem. Using a specialized Telegram bot to download YouTube playlists for free is arguably the fastest, safest, and most convenient method available today. This guide will explain everything you need to know, from finding the right bot to troubleshooting common issues.
Troubleshooting: Common Issues & Fixes
Even the best bots glitch. Here is how to solve the most common problems.
Problem: "Bot says 'Playlist is private or deleted.'" Solution: YouTube changed privacy settings. Ensure the playlist is set to "Public" or "Unlisted" (not Private). You cannot download others' private playlists.
Problem: "Bot downloads 1 video, then stops."
Solution: This is a rate limit. The bot is afraid of being banned by Telegram or YouTube. Wait 30 seconds and send the command /continue or /next.
Problem: "Files are being sent as 'Documents' and won't play in my music app." Solution: That is fine. Telegram sends files as documents to avoid compression. On Android, use a file manager to move the files to your "Music" folder. On iPhone, open the file in "VLC for Mobile."
Problem: "The video quality is only 480p."
Solution: YouTube separates video and audio streams for 1080p+. Many free bots don't have the bandwidth to merge them for an entire playlist. If you need high-res video, use a desktop tool like yt-dlp instead. telegram bot to download youtube playlist free
The #1 Recommended Bot: @YTBot_Official (And Alternatives)
To build a trustworthy article, we focus on the current top performer in the Telegram ecosystem for playlists: @YTBot_Official (often referred to as "YT Bot").
While dozens of bots exist (like @SaveVideoBot or @VideoHunterBot), few handle playlists reliably. YT Bot is widely considered the gold standard for bulk downloads.
========== BOT COMMANDS ==========
async def start(update: Update, context: ContextTypes.DEFAULT_TYPE): """Send welcome message""" welcome_text = """ π¬ YouTube Playlist Downloader Bot
Send me a YouTube playlist URL and I'll download it for you!
Commands: /start - Show this message /help - Get help /cancel - Cancel current download /mode - Change download mode (Audio/Video)
Features: β’ Download entire playlists β’ Choose audio or video format β’ Progress tracking β’ Cancel any time
How to use:
- Send a YouTube playlist URL
- Choose download mode (audio/video)
- Wait for download
- Get files sent to you
Limits: β’ Max 50MB per file (Telegram limit) β’ Files larger than 50MB will be skipped """ await update.message.reply_text(welcome_text, parse_mode='Markdown')
async def help_command(update: Update, context: ContextTypes.DEFAULT_TYPE): """Send help message""" help_text = """ How to use this bot:
1οΈβ£ Send a YouTube URL
- Playlist URL:
https://youtube.com/playlist?list=... - Single video works too
2οΈβ£ Choose mode
- Audio: Extract as MP3
- Video: Download as MP4
3οΈβ£ Wait for download
- Bot will process each video
- You can /cancel anytime
4οΈβ£ Receive files
- Files sent directly to chat
- Large files (50MB+) are skipped
Tips: β’ Use /mode to set default preference β’ Download status is shown in real-time β’ Files are automatically deleted after sending """ await update.message.reply_text(help_text, parse_mode='Markdown') The Ultimate Guide: Using a Telegram Bot to
async def cancel(update: Update, context: ContextTypes.DEFAULT_TYPE): """Cancel ongoing download""" user_id = update.effective_user.id
if user_id in user_sessions:
user_sessions[user_id]['cancel'] = True
await update.message.reply_text("β Download cancelled. Cleaning up...")
await delete_download_folder(user_id)
del user_sessions[user_id]
else:
await update.message.reply_text("No active download to cancel.")
async def set_mode(update: Update, context: ContextTypes.DEFAULT_TYPE): """Set download mode preference""" keyboard = [ [ InlineKeyboardButton("π΅ Audio (MP3)", callback_data="mode_audio"), InlineKeyboardButton("π¬ Video (MP4)", callback_data="mode_video") ] ] reply_markup = InlineKeyboardMarkup(keyboard) await update.message.reply_text( "Select download mode:", reply_markup=reply_markup )
async def handle_url(update: Update, context: ContextTypes.DEFAULT_TYPE): """Handle YouTube URL""" user_id = update.effective_user.id url = update.message.text.strip()
# Check if it's a YouTube URL
if not ('youtube.com' in url or 'youtu.be' in url):
await update.message.reply_text("β Please send a valid YouTube URL.")
return
# Check if already downloading
if user_id in user_sessions:
await update.message.reply_text("β οΈ You have an active download. Use /cancel first.")
return
# Show options
keyboard = [
[
InlineKeyboardButton("π΅ Download Audio (MP3)", callback_data=f"audio_url"),
InlineKeyboardButton("π¬ Download Video (MP4)", callback_data=f"video_url")
],
[InlineKeyboardButton("β Cancel", callback_data="cancel")]
]
reply_markup = InlineKeyboardMarkup(keyboard)
await update.message.reply_text(
"π₯ Choose download type:",
reply_markup=reply_markup
)
async def download_playlist(url: str, user_id: int, mode: str, update: Update): """Download playlist and send files""" status_msg = await update.message.reply_text("π Getting playlist information...")
try:
# Get playlist info
info = get_playlist_info(url)
if info['is_playlist']:
await status_msg.edit_text(
f"π *Playlist:* info['title']\n"
f"π΅ *Videos:* info['count']\n"
f"π― *Mode:* 'Audio' if mode == 'audio' else 'Video'\n\n"
f"Starting download..."
)
else:
await status_msg.edit_text(f"Downloading: info['title']")
# Prepare yt-dlp options
user_folder = Path(DOWNLOAD_DIR) / str(user_id)
user_folder.mkdir(exist_ok=True)
if mode == 'audio':
ydl_opts =
'format': 'bestaudio/best',
'postprocessors': [
'key': 'FFmpegExtractAudio',
'preferredcodec': 'mp3',
'preferredquality': '192',
],
'outtmpl': str(user_folder / '%(title)s.%(ext)s'),
'quiet': True,
'no_warnings': True,
'extract_flat': False,
else: # video
ydl_opts =
'format': 'best[height<=720]', # Limit to 720p to save size
'outtmpl': str(user_folder / '%(title)s.%(ext)s'),
'quiet': True,
'no_warnings': True,
'extract_flat': False,
# Download playlist
with yt_dlp.YoutubeDL(ydl_opts) as ydl:
# Hook for progress updates
def progress_hook(d):
if d['status'] == 'downloading':
if '_percent_str' in d:
percent = d.get('_percent_str', '0%').strip()
asyncio.create_task(
status_msg.edit_text(f"π₯ Downloading: percent complete...")
)
elif d['status'] == 'finished':
asyncio.create_task(
status_msg.edit_text("β
Download complete! Processing...")
)
ydl.add_progress_hook(progress_hook)
info = ydl.extract_info(url, download=True)
# Send files
if 'entries' in info: # Playlist
total = len(info['entries'])
sent = 0
skipped = 0
for idx, entry in enumerate(info['entries'], 1):
# Check for cancel
if user_id in user_sessions and user_sessions[user_id].get('cancel', False):
await update.message.reply_text("β Download cancelled by user.")
break
# Find downloaded file
video_title = entry.get('title', f'video_idx')
for file_path in user_folder.glob('*'):
if video_title in file_path.stem:
file_size_mb = get_size_mb(str(file_path))
if file_size_mb > MAX_FILE_SIZE_MB:
await update.message.reply_text(
f"β οΈ *Skipped:* video_title\n"
f"Size: file_size_mb:.1fMB > MAX_FILE_SIZE_MBMB limit",
parse_mode='Markdown'
)
skipped += 1
continue
# Send file
try:
with open(file_path, 'rb') as f:
if mode == 'audio':
await update.message.reply_audio(
audio=f,
title=video_title,
performer="YouTube",
caption=f"π sent+1/total"
)
else:
await update.message.reply_video(
video=f,
caption=f"π sent+1/total\nπ¬ video_title"
)
sent += 1
# Progress update
await status_msg.edit_text(
f"π€ Sent: sent/total\n"
f"βοΈ Skipped: skipped (size limit)\n"
f"β³ Progress: int((sent+skipped)/total*100)%"
)
except Exception as e:
await update.message.reply_text(f"β Failed to send video_title: str(e)[:100]")
break
await asyncio.sleep(0.5) # Rate limiting
# Summary
await update.message.reply_text(
f"β
*Download Complete!*\n"
f"π€ Sent: sent files\n"
f"βοΈ Skipped: skipped (size limit)\n"
f"π Total processed: sent+skipped/total",
parse_mode='Markdown'
)
else: # Single video
# Find the downloaded file
for file_path in user_folder.glob('*'):
file_size_mb = get_size_mb(str(file_path))
if file_size_mb > MAX_FILE_SIZE_MB:
await update.message.reply_text(
f"β File too large: file_size_mb:.1fMB > MAX_FILE_SIZE_MBMB limit"
)
else:
with open(file_path, 'rb') as f:
if mode == 'audio':
await update.message.reply_audio(
audio=f,
title=info.get('title', 'Audio'),
performer=info.get('uploader', 'YouTube')
)
else:
await update.message.reply_video(
video=f,
caption=f"π¬ info.get('title', 'Video')"
)
await update.message.reply_text("β
Download complete!")
except Exception as e:
await update.message.reply_text(f"β Error: str(e)[:200]")
finally:
# Cleanup
await delete_download_folder(user_id)
if user_id in user_sessions:
del user_sessions[user_id]
Prerequisites
- A Telegram account (Download from the App Store or Google Play).
- The URL of the YouTube playlist you want to save.
Honorable Mention: @utubebot
This is a newer bot built on yt-dlp (the faster fork of youtube-dl). It handles very long playlists (200+ videos) better than the competition, though it may take 5-10 minutes to compress the files.
Free vs. Freemium: Understanding the Limits
The keyword promises "free," and indeed, most Telegram bots start free. However, server costs are real. Here is the reality of "freemium" playlist bots:
- Free Tier: Usually allows downloading up to 10-20 videos from a playlist per day. File size is often capped at 50MB-100MB per video.
- Premium (Paid) Tier: Unlimited playlist length (e.g., 500 songs), 4K resolution, and faster queue times.
Pro Tip: If you have a massive playlist (200+ videos), break it into smaller chunks (e.g., videos 1-50, then 51-100). Most free bots allow this if you send the links sequentially, not all at once. Send a YouTube playlist URL Choose download mode
Step-by-Step: How to Download a YouTube Playlist via Telegram Bot
The process is uniform across almost every bot. Follow these steps:


