YouTube Thumbnail Grabber
Setup
Install yt-dlp:
pip install yt-dlp
Download Thumbnail
Using yt-dlp:
yt-dlp --write-thumbnail --skip-download "VIDEO_URL"
Convert to JPG:
yt-dlp --write-thumbnail --skip-download --convert-thumbnails jpg "VIDEO_URL"
Custom output path:
yt-dlp --write-thumbnail --skip-download -o "thumbnail" "VIDEO_URL"
Direct URL Method
Get thumbnail URL:
yt-dlp --get-thumbnail "VIDEO_URL"
Download with curl:
curl -o thumbnail.jpg "$(yt-dlp --get-thumbnail 'VIDEO_URL')"
Thumbnail URL Patterns
For video ID VIDEO_ID, thumbnails are available at:
# Maximum resolution (may not exist for all videos)
https://img.youtube.com/vi/VIDEO_ID/maxresdefault.jpg
# High quality (480x360)
https://img.youtube.com/vi/VIDEO_ID/hqdefault.jpg
# Medium quality (320x180)
https://img.youtube.com/vi/VIDEO_ID/mqdefault.jpg
# Standard quality (640x480)
https://img.youtube.com/vi/VIDEO_ID/sddefault.jpg
# Default (120x90)
https://img.youtube.com/vi/VIDEO_ID/default.jpg
Quick Download by Video ID
VIDEO_ID="dQw4w9WgXcQ"
# Max resolution
curl -o "thumb_max.jpg" "https://img.youtube.com/vi/${VIDEO_ID}/maxresdefault.jpg"
# HQ
curl -o "thumb_hq.jpg" "https://img.youtube.com/vi/${VIDEO_ID}/hqdefault.jpg"
Download All Resolutions
VIDEO_ID="dQw4w9WgXcQ"
for res in maxresdefault sddefault hqdefault mqdefault default; do
curl -o "${VIDEO_ID}_${res}.jpg" "https://img.youtube.com/vi/${VIDEO_ID}/${res}.jpg"
done
Extract Video ID from URL
# From full URL
echo "https://www.youtube.com/watch?v=dQw4w9WgXcQ" | grep -oP '(?<=v=)[^&]+'
# Or using yt-dlp
yt-dlp --get-id "VIDEO_URL"
Batch Download Thumbnails
From playlist:
yt-dlp --write-thumbnail --skip-download -o "%(title)s" "PLAYLIST_URL"
From file with URLs:
yt-dlp --write-thumbnail --skip-download -a urls.txt
Get Thumbnail with Metadata
yt-dlp --dump-json "VIDEO_URL" | python3 -c "
import sys, json
d = json.load(sys.stdin)
print(f\"Title: {d['title']}\")
print(f\"Thumbnail: {d['thumbnail']}\")
for t in d.get('thumbnails', []):
print(f\" {t.get('width', '?')}x{t.get('height', '?')}: {t['url']}\")"
Download Best Available Thumbnail
python3 -c "
import sys
import urllib.request
video_id = sys.argv[1]
resolutions = ['maxresdefault', 'sddefault', 'hqdefault', 'mqdefault', 'default']
for res in resolutions:
url = f'https://img.youtube.com/vi/{video_id}/{res}.jpg'
try:
urllib.request.urlretrieve(url, f'{video_id}.jpg')
print(f'Downloaded: {res} ({url})')
break
except:
continue
" "VIDEO_ID"
Thumbnail Resolutions
| Name | Resolution | Notes |
|---|---|---|
| maxresdefault | 1280x720 | Not always available |
| sddefault | 640x480 | Standard |
| hqdefault | 480x360 | High quality |
| mqdefault | 320x180 | Medium quality |
| default | 120x90 | Always available |
| 0, 1, 2, 3 | 120x90 | Video frame captures |
Alternative Thumbnail Frames
YouTube stores multiple frame captures:
VIDEO_ID="dQw4w9WgXcQ"
# Different moments from the video
curl -o "frame0.jpg" "https://img.youtube.com/vi/${VIDEO_ID}/0.jpg"
curl -o "frame1.jpg" "https://img.youtube.com/vi/${VIDEO_ID}/1.jpg"
curl -o "frame2.jpg" "https://img.youtube.com/vi/${VIDEO_ID}/2.jpg"
curl -o "frame3.jpg" "https://img.youtube.com/vi/${VIDEO_ID}/3.jpg"
Notes
maxresdefaultonly exists for HD videos- Fall back to
hqdefaultif max resolution fails - Thumbnails are cached by YouTube CDN
- No authentication required for public videos
- WebP format may be returned; use
--convert-thumbnails jpgto convert - Frame captures (0-3) show different moments from the video