Download videos, audio, images, post text, and attachments from Patreon posts you can already access.
Patreon Downloader is a browser extension built for subscribers, creators, researchers, and teams who want a simpler way to save Patreon content for offline viewing, local backup, and personal organization. It works inside your active Patreon browser session, detects supported media on creator posts, and gives you a direct download workflow without needing separate desktop tools.
- Save Patreon videos from supported creator posts
- Download audio, podcast-style posts, images, and file attachments
- Capture post text for personal archiving and reference
- Keep local copies for offline viewing, study, review, or backup
- Use the same browser-first workflow across Chrome, Edge, Brave, Opera, Yandex, and Whale
- 🚀 Get it here: Patreon Downloader
- Why Patreon Downloader
- Features
- How It Works
- Step-by-Step Tutorial: How to Download Patreon Content
- Supported Formats
- Who It's For
- Common Use Cases
- Troubleshooting
- Trial & Access
- Installation Instructions
- FAQ
- Notes
- About Patreon
Patreon creators publish a mix of videos, audio posts, image galleries, written updates, and downloadable files. That content is often easy to stream in the browser but harder to save in an organized local library, especially when you want to watch offline, back up materials from creators you support, or keep training resources available after a browser session ends.
Patreon Downloader focuses on that workflow. It runs in the Patreon page you are already using, reads the media available to your logged-in session, and presents supported download options through the extension popup and in-page controls.
- Video detection for supported Patreon post pages
- Audio and podcast-style media downloads where available
- Image and gallery download support for accessible post media
- Attachment downloads for creator-uploaded files
- Post text capture for personal notes and local reference
- Quality selection when the source exposes multiple video options
- MP4 output for supported video downloads
- Popup workflow for reviewing detected media
- Progress tracking during active downloads
- Cross-browser support for Chrome, Edge, Brave, Opera, Yandex, and Whale
- Install the extension from the latest release.
- Open Patreon and sign in to the account with access to the creator content.
- Navigate to a creator post or video page you want to save.
- Start playback if the post contains video or audio, so the media stream can initialize.
- Open the extension popup or use the in-page download button when it appears.
- Review the detected media and choose the item or quality you want.
- Start the download and save the file locally.
- Install Patreon Downloader from the latest GitHub release.
- Sign in to Patreon in the same browser profile.
- Open the Patreon post that contains the video, audio, image, text, or attachment you want to save.
- Let the page load fully.
- For video or audio posts, press play and wait a few seconds.
- Click the Patreon Downloader extension button in your browser toolbar.
- Select the detected media or attachment.
- Choose an available quality option when one is shown.
- Start the download and wait for the export to finish.
- Open the saved file from your Downloads folder.
- Input: Supported Patreon video streams
- Input: Supported Patreon audio posts
- Input: Patreon-hosted images and galleries
- Input: Creator-uploaded attachments
- Input: Patreon post text
- Output: MP4 for supported video downloads
- Output: Original source formats for supported images, audio, text, and attachments where available
Saved files are generated from media available in your browser session, so available formats and quality levels depend on how the creator uploaded the post and how Patreon serves that content.
- Patreon subscribers who want offline access to content from creators they support
- Creators backing up their own Patreon posts and media
- Students saving educational videos, audio, worksheets, or reference files
- Podcast listeners keeping local copies of Patreon-only audio posts
- Teams archiving training, community, or membership resources
- Save a Patreon video for offline viewing while traveling
- Download an audio post for local playback
- Archive creator attachments such as PDFs, ZIP files, templates, or project files
- Keep a local backup of posts from creators you support
- Organize Patreon media into a personal offline library
The extension is not detecting the post video
Press play first and wait a few seconds so Patreon has time to initialize the stream.
No quality options are showing
Some posts expose only one playable stream or file option.
The popup says no media was found
Refresh the post, let it load fully, start playback for video or audio, then reopen the extension popup.
The page requires login or membership access
The extension only works on content your Patreon account can already access in the current browser session.
The file will not download
Try refreshing the post and downloading again. If the issue continues, open a GitHub issue or contact SERP support with the post type and browser you are using.
- Includes 3 free downloads so you can test the workflow first
- Email sign-in uses secure one-time password verification
- No credit card required for the trial
- Unlimited downloads are available with a paid license
Start here: https://apps.serp.co/patreon-downloader
- Open the latest release page: https://github.com/serpapps/patreon-downloader/releases/latest
- Download the extension build for your browser.
- Install the extension.
- Open Patreon and sign in.
- Open a supported Patreon post.
- Use the extension popup or in-page button to detect and download available content.
What kinds of Patreon content can I download?
Supported Patreon videos, audio, images, post text, and creator-uploaded attachments that are available to your logged-in Patreon session.
Do I need to press play first?
For video and audio posts, yes. Many streams are only exposed after playback starts.
What file format do video downloads use?
Supported videos are saved as MP4 files.
Does it work on private or paid posts?
It works only when your Patreon account already has access to that post in the browser.
Do I need extra software?
No. The download workflow runs through the browser extension.
This repository is distributed under the proprietary SERP Apps license in the LICENSE file. Review that file before copying, modifying, or redistributing any part of this project.
- Only download content you own or have explicit permission to save
- The extension only works on media you can already access in your browser session
- Media quality depends on the source content Patreon exposes for that post
- Patreon platform changes may affect detection and download behavior
- An internet connection is required for the initial download
Patreon is a membership platform used by creators to publish subscriber-only videos, audio, writing, images, and digital files. Because Patreon content can be delivered in several different post formats, saving accessible media locally is often less direct than normal file downloads. Patreon Downloader simplifies that process for users who need an offline copy of content they can already view in their Patreon account.
A comprehensive research document analyzing Patreon's video infrastructure, embed patterns, stream formats, and optimal download strategies using modern tools
Authors: SERP Apps
Date: December 2024
Version: 1.0
This research document provides a comprehensive analysis of Patreon's video streaming infrastructure, including native video hosting, third-party embeds, content delivery networks (CDNs), stream formats, and optimal download methodologies. We examine the technical architecture behind Patreon's video delivery system and provide practical implementation guidance using industry-standard tools like yt-dlp, ffmpeg, patreon-dl, gallery-dl, and alternative solutions for reliable video extraction and download.
- Introduction
- Patreon Video Infrastructure Overview
- Embed URL Patterns and Detection
- Stream Formats and CDN Analysis
- yt-dlp Implementation Strategies
- FFmpeg Processing Techniques
- Patreon-dl Tool Implementation
- Alternative Tools and Backup Methods
- Implementation Recommendations
- Troubleshooting and Edge Cases
- Conclusion
Patreon has evolved from a simple patronage platform to a comprehensive content delivery system with native video hosting, livestreaming capabilities, and sophisticated third-party video embedding. This research examines the technical infrastructure behind Patreon's video delivery system, with particular focus on developing robust download strategies for archival, offline viewing, and content preservation.
This document covers:
- Technical analysis of Patreon's video streaming architecture
- Comprehensive URL pattern recognition for embedded and native videos
- Stream format analysis across different quality levels
- Practical implementation using open-source tools
- Backup strategies for edge cases and failures
Our research methodology includes:
- Network traffic analysis of Patreon video playback
- Reverse engineering of embed mechanisms
- Testing with various quality settings and formats
- Validation across multiple CDN endpoints
- Analysis of both native Patreon videos and third-party embeds
Patreon supports multiple video hosting mechanisms:
- Videos uploaded directly to Patreon's servers
- Hosted on Patreon's CDN infrastructure
- Protected by session-based authentication
- Supports up to 5GB per file
- Formats: MP4, MOV, MPEG, OGG
- YouTube embeds via iframe
- Vimeo embeds via iframe
- Other providers through Embed.ly integration
- Downloadable video files attached to posts
- Direct download links for patrons
Patreon utilizes a multi-tier CDN strategy:
Primary CDN: Amazon CloudFront
- Primary Domain:
cdn.patreon.com - Backup Domains: Various CloudFront distributions (
*.cloudfront.net) - Geographic Distribution: Global edge locations with regional optimization
For Vimeo Embeds:
- Primary Domain:
vod-adaptive.akamaized.net - Alternative:
vod-progressive.akamaized.net - Vimeo CDN:
*.vimeocdn.com
For YouTube Embeds:
- Primary Domain:
*.googlevideo.com - Alternative:
*.youtube.com
Patreon's native video processing follows this pipeline:
- Upload: Original video uploaded to Patreon servers
- Transcoding: Multiple formats and quality levels generated
- Quality Levels: Auto-generated 480p, 720p, 1080p variants
- CDN Distribution: Files distributed across CloudFront network
- Adaptive Streaming: HLS manifests created for dynamic quality
- Session-based Authentication: Requires valid patron session cookies
- Token-based URLs: Time-limited signed URLs for CDN access
- Membership Gating: Content restricted to appropriate tier patrons
- Rate Limiting: Per-session download limitations
- Referrer Checking: Domain-based access restrictions
https://www.patreon.com/posts/{POST_ID}
https://www.patreon.com/posts/{POST_TITLE}-{POST_ID}
https://patreon.com/posts/{POST_ID}
https://www.patreon.com/{CREATOR_NAME}
https://www.patreon.com/c/{CREATOR_NAME}
https://www.patreon.com/user?u={USER_ID}
https://cdn.patreon.com/video/{UNIQUE_ID}/filename.mp4
https://stream.patreon.com/{PATH}/{FILENAME}.m3u8
https://www.youtube.com/embed/{VIDEO_ID}
https://www.youtube.com/watch?v={VIDEO_ID}
https://youtu.be/{VIDEO_ID}
https://player.vimeo.com/video/{VIDEO_ID}
https://player.vimeo.com/video/{VIDEO_ID}?h={HASH}
https://vimeo.com/{VIDEO_ID}
https://vod-adaptive.akamaized.net/{VIDEO_ID}/master.m3u8?{AUTH_PARAMS}
https://vod-adaptive-ak.vimeocdn.com/exp={TIMESTAMP}~hmac={HASH}/{VIDEO_ID}/v2/playlist/av/primary/playlist.m3u8
Patreon Post ID:
patreon\.com/posts/(?:[^-]+-)?(\d+)
patreon\.com/posts/(\d+)YouTube Video ID:
(?:youtube\.com/(?:watch\?v=|embed/)|youtu\.be/)([A-Za-z0-9_-]{11})Vimeo Video ID:
(?:player\.)?vimeo\.com/(?:video/)?(\d+)General Video URL Pattern:
https?://(?:player\.|www\.)?(youtube\.com|youtu\.be|vimeo\.com)/(?:watch\?v=|video/|embed/|channels/\w+/)?([A-Za-z0-9._%-]+)Extract Patreon post IDs from HTML:
# Extract post IDs from page content
grep -oE "patreon\.com/posts/[^\"'>\s]+" input.html | grep -oE "[0-9]+$"
# Extract from multiple files
find . -name "*.html" -exec grep -oE "patreon\.com/posts/[0-9]+" {} +Extract embedded video URLs:
# Extract YouTube embed URLs
grep -oE "youtube\.com/embed/[A-Za-z0-9_-]{11}" page.html
# Extract Vimeo embed URLs
grep -oE "player\.vimeo\.com/video/[0-9]+" page.html
# Extract all video-related URLs
grep -oE "https?://[^\"\s]*\.(mp4|m3u8|webm)[^\"\s]*" page.htmlUsing yt-dlp for detection and metadata extraction:
# Test if URL contains downloadable video
yt-dlp --dump-json "https://www.patreon.com/posts/{POST_ID}" | jq '.id'
# Extract all video information
yt-dlp --dump-json "https://www.patreon.com/posts/{POST_ID}" > video_info.json
# Check available formats
yt-dlp --list-formats "https://www.patreon.com/posts/{POST_ID}"- Container: MP4, MOV, MPEG, OGG
- Maximum Size: 5GB per file
- Duration: Varies by tier (limited monthly hours)
- Container: MP4
- Video Codec: H.264 (AVC)
- Audio Codec: AAC
- Quality Levels: 480p, 720p, 1080p (device/bandwidth adaptive)
- Streaming: HTTP Live Streaming (HLS)
#EXTM3U
#EXT-X-STREAM-INF:BANDWIDTH=800000,RESOLUTION=640x360
https://cdn.patreon.com/.../360p/playlist.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=1600000,RESOLUTION=1280x720
https://cdn.patreon.com/.../720p/playlist.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=3200000,RESOLUTION=1920x1080
https://cdn.patreon.com/.../1080p/playlist.m3u8
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:6
#EXTINF:6.006,
segment001.ts
#EXTINF:6.006,
segment002.ts
...
#EXT-X-ENDLIST
https://vod-adaptive-ak.vimeocdn.com/exp={TIMESTAMP}~hmac={HMAC}/{VIDEO_ID}/v2/playlist/av/primary/playlist.m3u8
Components:
exp: Expiration timestamphmac: Hash-based message authentication codeVIDEO_ID: Numeric video identifier- Query parameters:
qsr,pathsigfor additional security
https://vod-adaptive.akamaized.net/{VIDEO_ID}/master.m3u8?{AUTH_PARAMS}
https://vod-progressive.akamaized.net/exp={TIMESTAMP}~acl=%2F{PATH}%2F*~hmac={HASH}/{VIDEO_ID}/{QUALITY}/file.mp4
| Quality | Resolution | Typical Bitrate | Use Case |
|---|---|---|---|
| 360p | 640x360 | ~800 kbps | Mobile/Low bandwidth |
| 480p | 854x480 | ~1.2 Mbps | Standard definition |
| 720p | 1280x720 | ~2.5 Mbps | HD streaming |
| 1080p | 1920x1080 | ~4.5 Mbps | Full HD |
# Test Patreon CDN availability
curl -I "https://cdn.patreon.com/" 2>&1 | head -5
# Test Vimeo CDN (for embedded videos)
curl -I "https://vod-adaptive.akamaized.net/" 2>&1 | head -5
# Check CDN response headers
curl -I -H "Referer: https://www.patreon.com/" "https://cdn.patreon.com/video/{ID}/file.mp4"# Using pip (recommended)
pip install -U yt-dlp
# Using conda
conda install -c conda-forge yt-dlp
# Using Homebrew (macOS)
brew install yt-dlp
# Direct download
curl -L https://github.com/yt-dlp/yt-dlp/releases/latest/download/yt-dlp -o /usr/local/bin/yt-dlp
chmod a+rx /usr/local/bin/yt-dlpExport cookies from browser:
# Using yt-dlp's built-in browser cookie extraction
yt-dlp --cookies-from-browser chrome "https://www.patreon.com/posts/{POST_ID}"
yt-dlp --cookies-from-browser firefox "https://www.patreon.com/posts/{POST_ID}"
# Using exported cookies file
yt-dlp --cookies patreon_cookies.txt "https://www.patreon.com/posts/{POST_ID}"Manual cookie extraction process:
- Install browser extension "Get cookies.txt LOCALLY"
- Navigate to patreon.com while logged in
- Export cookies to file
patreon_cookies.txt - Use with yt-dlp via
--cookiesoption
# Netscape HTTP Cookie File
.patreon.com TRUE / TRUE 1700000000 session_id abc123...
.patreon.com TRUE / FALSE 1700000000 patreon_device_id xyz789...
# Download best quality
yt-dlp --cookies-from-browser firefox "https://www.patreon.com/posts/{POST_ID}"
# Download specific quality
yt-dlp --cookies-from-browser firefox -f "best[height<=720]" "https://www.patreon.com/posts/{POST_ID}"
# Download with custom filename
yt-dlp --cookies-from-browser firefox -o "%(uploader)s - %(title)s.%(ext)s" "https://www.patreon.com/posts/{POST_ID}"# List available formats
yt-dlp --cookies-from-browser firefox -F "https://www.patreon.com/posts/{POST_ID}"
# Download specific format by ID
yt-dlp --cookies-from-browser firefox -f 22 "https://www.patreon.com/posts/{POST_ID}"
# Best video + best audio (merge)
yt-dlp --cookies-from-browser firefox -f "bv+ba/best" "https://www.patreon.com/posts/{POST_ID}"
# Best MP4 up to 1080p
yt-dlp --cookies-from-browser firefox -f "best[height<=1080][ext=mp4]" "https://www.patreon.com/posts/{POST_ID}"# Download with metadata and thumbnail
yt-dlp --cookies-from-browser firefox \
--write-description \
--write-info-json \
--write-thumbnail \
--embed-metadata \
"https://www.patreon.com/posts/{POST_ID}"
# Download with subtitles
yt-dlp --cookies-from-browser firefox \
--write-subs \
--sub-langs en \
"https://www.patreon.com/posts/{POST_ID}"
# Rate limiting and retries
yt-dlp --cookies-from-browser firefox \
--limit-rate 2M \
--retries 5 \
--fragment-retries 5 \
"https://www.patreon.com/posts/{POST_ID}"# Create list of URLs
cat > patreon_urls.txt << EOF
https://www.patreon.com/posts/12345
https://www.patreon.com/posts/67890
https://www.patreon.com/posts/11111
EOF
# Download all
yt-dlp --cookies-from-browser firefox -a patreon_urls.txt
# With archive tracking (skip already downloaded)
yt-dlp --cookies-from-browser firefox \
--download-archive downloaded.txt \
-a patreon_urls.txt# With delays to avoid rate limiting
yt-dlp --cookies-from-browser firefox \
--sleep-interval 3 \
--max-sleep-interval 10 \
--limit-rate 1M \
-a patreon_urls.txtCreate ~/.config/yt-dlp/config:
# Output template
-o "%(uploader)s/%(title)s.%(ext)s"
# Metadata
--write-description
--write-info-json
--write-thumbnail
--embed-metadata
# Quality settings
--format "bv[height<=1080]+ba/best[height<=1080]"
# Network settings
--retries 5
--fragment-retries 5
--rate-limit 2M
# User agent
--user-agent "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"# Continue on errors
yt-dlp --cookies-from-browser firefox \
--ignore-errors \
-a patreon_urls.txt
# Verbose output for debugging
yt-dlp --cookies-from-browser firefox \
--verbose \
"https://www.patreon.com/posts/{POST_ID}" 2>&1 | tee debug.log
# Check URL accessibility
yt-dlp --cookies-from-browser firefox \
--list-formats \
"https://www.patreon.com/posts/{POST_ID}" 2>&1 | grep -i "login\|private\|password"# Ubuntu/Debian
sudo apt-get install ffmpeg
# macOS
brew install ffmpeg
# Windows (via Chocolatey)
choco install ffmpeg# Analyze stream details (JSON output)
ffprobe -v quiet -print_format json -show_format -show_streams "input.mp4"
# Get duration
ffprobe -v quiet -show_entries format=duration -of csv="p=0" "input.mp4"
# Check codec information
ffprobe -v quiet -select_streams v:0 -show_entries stream=codec_name,width,height -of csv="s=x:p=0" "input.mp4"# Analyze HLS stream
ffprobe -v quiet -print_format json -show_format -show_streams "https://example.com/playlist.m3u8"
# List available streams in master playlist
ffprobe -v quiet -show_streams "https://example.com/master.m3u8"
# Get detailed stream info
ffprobe -v quiet -print_format json -show_format "https://cdn.patreon.com/.../master.m3u8"# Download HLS stream and convert to MP4
ffmpeg -i "https://example.com/playlist.m3u8" -c copy output.mp4
# With protocol whitelist (for security-restricted streams)
ffmpeg -protocol_whitelist file,http,https,tcp,tls,crypto \
-i "https://example.com/playlist.m3u8" \
-c copy output.mp4# Download with custom headers
ffmpeg -headers "User-Agent: Mozilla/5.0\r\nReferer: https://www.patreon.com/\r\n" \
-i "https://cdn.patreon.com/.../playlist.m3u8" \
-c copy output.mp4# Download specific quality stream
ffmpeg -i "https://example.com/720p/playlist.m3u8" -c copy output_720p.mp4
# Download best quality from master playlist
ffmpeg -i "https://example.com/master.m3u8" \
-map 0:v:0 -map 0:a:0 \
-c copy output_best.mp4# Convert WebM to MP4
ffmpeg -i input.webm -c:v libx264 -c:a aac output.mp4
# Convert with quality control
ffmpeg -i input.mp4 -c:v libx264 -crf 23 -c:a aac -b:a 128k output_compressed.mp4
# Quick copy (no re-encoding)
ffmpeg -i input.ts -c copy output.mp4# Fix AAC audio for MP4 container
ffmpeg -i "playlist.m3u8" -c copy -bsf:a aac_adtstoasc output.mp4# Scale to 720p
ffmpeg -i input.mp4 -vf scale=1280:720 -c:v libx264 -crf 23 -c:a copy output_720p.mp4
# Maintain aspect ratio
ffmpeg -i input.mp4 -vf "scale=1280:-2" -c:v libx264 output_scaled.mp4# Extract audio as AAC
ffmpeg -i input.mp4 -vn -c:a aac audio_only.aac
# Extract audio as MP3
ffmpeg -i input.mp4 -vn -c:a libmp3lame -b:a 192k audio_only.mp3# Video without audio
ffmpeg -i input.mp4 -an -c:v copy video_only.mp4# Combine video and audio
ffmpeg -i video.mp4 -i audio.aac -c copy combined.mp4
# With offset synchronization
ffmpeg -i video.mp4 -itsoffset 0.5 -i audio.aac -c copy synced.mp4# Handle broken segments
ffmpeg -err_detect ignore_err -i "playlist.m3u8" -c copy output.mp4
# Fix timestamp issues
ffmpeg -i input.mp4 -avoid_negative_ts make_zero -c copy fixed.mp4
# Reconstruct index for seeking
ffmpeg -i input.mp4 -c copy -movflags +faststart output.mp4
# Handle segment retry
ffmpeg -protocol_whitelist file,http,https,tcp,tls -max_reload 5 \
-i "master.m3u8" -c copy output.mp4patreon-dl is a specialized Node.js-based command-line tool designed specifically for downloading content from Patreon posts, including support for embedded video extraction.
# Prerequisites
# - Node.js v20 or higher
# - FFmpeg (recommended)
# Install globally via npm
npm i -g patreon-dl
# Verify installation
patreon-dl --version# Basic download
patreon-dl --cookie "your_session_cookie" "https://www.patreon.com/posts/{POST_ID}"
# With output directory
patreon-dl --cookie "your_session_cookie" \
--out-dir ./downloads \
"https://www.patreon.com/posts/{POST_ID}"# Download all posts from creator
patreon-dl --cookie "your_session_cookie" \
--out-dir ./downloads \
"https://www.patreon.com/{CREATOR_NAME}"| Option | Description |
|---|---|
--cookie <string> |
Patreon session cookie for authentication |
--ffmpeg <path> |
Path to FFmpeg binary |
--config-file <path> |
Path to configuration file |
--out-dir <path> |
Output directory for downloads |
--log-level <level> |
Logging verbosity (info, debug, warn, error) |
--no-prompt |
Skip confirmation prompts |
--dry-run |
Test without saving files |
--deno <path> |
Path to Deno binary (for YouTube Premium) |
[downloader]
path.to.ffmpeg = "/usr/bin/ffmpeg"
path.to.deno = "/usr/bin/deno"
[output]
directory = "./downloads"
filename.template = "{post.title}"# YouTube embed downloader
[embed.downloader.youtube]
exec = yt-dlp -o "{dest.dir}/%(title)s.%(ext)s" "{embed.url}"
# Vimeo embed downloader
[embed.downloader.vimeo]
exec = yt-dlp -o "{dest.dir}/%(title)s.%(ext)s" "{embed.url}"
# Generic video downloader
[embed.downloader.default]
exec = yt-dlp -o "{dest.dir}/%(title)s.%(ext)s" "{embed.url}"{embed.url}: Extracted video embed URL{embed.provider}: Video provider (YouTube, Vimeo){post.id}: Patreon post ID{post.title}: Post title{dest.dir}: Destination directory
From Browser Developer Tools:
- Open patreon.com in browser
- Login to your account
- Open Developer Tools (F12)
- Go to Application/Storage → Cookies
- Find
session_idcookie - Copy the value
Using browser extensions:
- Install "EditThisCookie" or similar
- Navigate to patreon.com
- Export cookies in Netscape format
# With verbose logging
patreon-dl --cookie "session_cookie" \
--log-level debug \
--out-dir ./downloads \
"https://www.patreon.com/posts/{POST_ID}"
# Using config file
patreon-dl --cookie "session_cookie" \
--config-file ./patreon-dl.conf \
"https://www.patreon.com/{CREATOR}"
# Dry run to test
patreon-dl --cookie "session_cookie" \
--dry-run \
"https://www.patreon.com/posts/{POST_ID}"gallery-dl is a powerful cross-platform tool for downloading images and videos from many content platforms including Patreon.
# Using pip
python3 -m pip install -U gallery-dl
# Using Homebrew (macOS)
brew install gallery-dl
# Using Snap (Linux)
snap install gallery-dl# Download with browser cookies
gallery-dl --cookies-from-browser firefox "https://www.patreon.com/{CREATOR}"
# Download specific post
gallery-dl --cookies-from-browser firefox "https://www.patreon.com/posts/{POST_ID}"
# Get URLs only (no download)
gallery-dl --get-urls --cookies-from-browser firefox "https://www.patreon.com/{CREATOR}"
# Save to specific directory
gallery-dl --cookies-from-browser firefox \
--destination "/path/to/folder" \
"https://www.patreon.com/{CREATOR}"Create ~/.config/gallery-dl/config.json:
{
"extractor": {
"patreon": {
"cookies": ["firefox"],
"directory": ["patreon", "{creator[vanity]}"],
"filename": "{id}_{title}.{extension}",
"videos": true,
"postfiles": true
}
}
}Streamlink specializes in live streams but can handle recorded content on supported platforms.
# Using pip
pip install streamlink
# Using Homebrew (macOS)
brew install streamlink# Stream to player
streamlink "https://example.com/stream" best
# Save to file
streamlink "https://example.com/stream" best -o output.mp4
# Specify quality
streamlink "https://example.com/stream" 720p -o output_720p.mp4Note: Streamlink has limited direct Patreon support. It works best when you have the direct HLS stream URL.
# Using wget with authentication
wget --header="Cookie: session_id=YOUR_SESSION_COOKIE" \
--header="Referer: https://www.patreon.com/" \
-O "video.mp4" \
"https://cdn.patreon.com/video/{ID}/file.mp4"
# Using cURL
curl -H "Cookie: session_id=YOUR_SESSION_COOKIE" \
-H "Referer: https://www.patreon.com/" \
-H "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36" \
-L -o "video.mp4" \
"https://cdn.patreon.com/video/{ID}/file.mp4"# Download m3u8 playlist
wget -O playlist.m3u8 "https://cdn.patreon.com/.../master.m3u8"
# Extract segment URLs and download
grep -v "^#" playlist.m3u8 | xargs -I {} wget {}- Open browser Developer Tools (F12)
- Navigate to Network tab
- Filter by "mp4", "m3u8", or "media"
- Play the Patreon video
- Identify video stream URLs
- Right-click → Copy as cURL
# Export HAR file from browser
# Extract video URLs
grep -oE "https://[^\"]*\.(mp4|m3u8|ts)[^\"]*" network_export.har | sort -uRecommended browser extensions for video extraction:
- Video DownloadHelper (Firefox/Chrome)
- Patreon Downloader (Chrome) - For downloadable attachments
- Stream Detector (Firefox) - Detects HLS streams
| Tool | Patreon Support | Authentication | Best For |
|---|---|---|---|
| yt-dlp | Good (with cookies) | Cookies | General downloads |
| patreon-dl | Excellent | Session cookie | Patreon-specific |
| gallery-dl | Good | Cookies | Bulk downloads |
| FFmpeg | Direct streams | Headers | HLS processing |
| Streamlink | Limited | N/A | Live streams |
| wget/cURL | Direct files | Cookies/Headers | Simple downloads |
- patreon-dl: Primary tool for Patreon-specific content
- yt-dlp: Secondary for embedded videos (YouTube, Vimeo)
- gallery-dl: Backup for bulk content
- FFmpeg: For direct HLS stream processing
- wget/cURL: Last resort for direct file URLs
#!/bin/bash
# download_patreon_video.sh
# Cookie handling:
# - For yt-dlp/gallery-dl: Use Netscape cookie file format
# - For patreon-dl: Use session cookie string directly
COOKIE_FILE="$HOME/.patreon_cookies.txt"
SESSION_COOKIE="your_session_cookie_here" # Set this from session_id cookie
OUTPUT_DIR="${2:-./downloads}"
URL="$1"
mkdir -p "$OUTPUT_DIR"
echo "Attempting download of: $URL"
# Method 1: patreon-dl (if available)
# Note: patreon-dl uses --cookie with a string value, not a file
if command -v patreon-dl &> /dev/null; then
echo "Trying patreon-dl..."
if patreon-dl --cookie "$SESSION_COOKIE" --out-dir "$OUTPUT_DIR" "$URL"; then
echo "✓ Success with patreon-dl"
exit 0
fi
fi
# Method 2: yt-dlp (uses Netscape cookie file or browser cookies)
echo "Trying yt-dlp..."
if yt-dlp --cookies "$COOKIE_FILE" -o "$OUTPUT_DIR/%(title)s.%(ext)s" "$URL"; then
echo "✓ Success with yt-dlp"
exit 0
fi
# Method 3: gallery-dl
echo "Trying gallery-dl..."
if gallery-dl --cookies "$COOKIE_FILE" --destination "$OUTPUT_DIR" "$URL"; then
echo "✓ Success with gallery-dl"
exit 0
fi
echo "✗ All methods failed"
exit 1# Quality selection function
select_quality() {
local url="$1"
local max_quality="${2:-1080}"
local max_size_mb="${3:-500}"
echo "Checking available formats..."
yt-dlp --cookies-from-browser firefox -F "$url"
echo "Downloading with quality limit: ${max_quality}p, size limit: ${max_size_mb}MB"
yt-dlp --cookies-from-browser firefox \
-f "best[height<=$max_quality][filesize<${max_size_mb}M]/best[height<=$max_quality]/best" \
"$url"
}#!/bin/bash
# batch_download_patreon.sh
URL_FILE="$1"
OUTPUT_DIR="${2:-./downloads}"
DELAY="${3:-5}"
mkdir -p "$OUTPUT_DIR"
total=$(wc -l < "$URL_FILE")
current=0
while IFS= read -r url; do
[[ "$url" =~ ^#.*$ ]] && continue # Skip comments
[[ -z "$url" ]] && continue # Skip empty lines
((current++))
echo "[$current/$total] Downloading: $url"
yt-dlp --cookies-from-browser firefox \
-o "$OUTPUT_DIR/%(uploader)s/%(title)s.%(ext)s" \
--retries 3 \
--fragment-retries 3 \
"$url"
echo "Waiting ${DELAY} seconds..."
sleep "$DELAY"
done < "$URL_FILE"
echo "Batch download complete!"# Download multiple videos in parallel (max 3 concurrent)
download_single() {
local url="$1"
yt-dlp --cookies-from-browser firefox \
-o "./downloads/%(title)s.%(ext)s" \
--limit-rate 500K \
"$url"
}
export -f download_single
# Using GNU parallel
parallel -j 3 download_single :::: urls.txtdownload_with_retries() {
local url="$1"
local max_retries=3
local delay=5
for i in $(seq 1 $max_retries); do
echo "Attempt $i of $max_retries..."
if yt-dlp --cookies-from-browser firefox \
--retries 2 \
--fragment-retries 2 \
"$url"; then
echo "✓ Success on attempt $i"
return 0
fi
echo "Failed, waiting ${delay}s before retry..."
sleep $delay
delay=$((delay * 2)) # Exponential backoff
done
echo "✗ All attempts failed"
return 1
}check_authentication() {
local test_url="$1"
if yt-dlp --cookies-from-browser firefox \
--dump-json "$test_url" 2>&1 | grep -q "login\|private\|authenticate"; then
echo "⚠ Authentication expired. Please refresh cookies."
return 1
fi
echo "✓ Authentication valid"
return 0
}setup_logging() {
local log_dir="./logs"
mkdir -p "$log_dir"
local date_stamp=$(date +"%Y%m%d")
export DOWNLOAD_LOG="$log_dir/downloads_$date_stamp.log"
export ERROR_LOG="$log_dir/errors_$date_stamp.log"
}
log_download() {
local action="$1"
local url="$2"
local timestamp=$(date '+%Y-%m-%d %H:%M:%S')
case "$action" in
"start")
echo "[$timestamp] START: $url" >> "$DOWNLOAD_LOG"
;;
"complete")
local file="$3"
echo "[$timestamp] COMPLETE: $url -> $file" >> "$DOWNLOAD_LOG"
;;
"error")
local error="$3"
echo "[$timestamp] ERROR: $url | $error" >> "$ERROR_LOG"
;;
esac
}Issue: "Login required" or "Private content"
# Solution 1: Refresh browser cookies
yt-dlp --cookies-from-browser firefox --rm-cache-dir "URL"
# Solution 2: Re-export cookies file
# Delete old cookie file and re-export from browser
# Solution 3: Use fresh browser session
# Log out, clear cookies, log back in, then exportIssue: Cookie expiration
# Check cookie validity
yt-dlp --cookies-from-browser firefox --dump-json "URL" 2>&1 | head -20
# Cookies typically expire after:
# - Session cookies: Browser close
# - Persistent cookies: 30 daysIssue: "Too many requests" errors
# Add delays between downloads
yt-dlp --cookies-from-browser firefox \
--sleep-interval 5 \
--max-sleep-interval 15 \
--limit-rate 1M \
"URL"Issue: IP-based blocking
# Use different user agent
yt-dlp --cookies-from-browser firefox \
--user-agent "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36" \
"URL"Issue: No video formats available
# Check if content is embedded from another platform
yt-dlp --cookies-from-browser firefox --dump-json "URL" | jq '.entries'
# For embedded YouTube/Vimeo, extract embed URL firstIssue: Audio/video sync problems
# Re-encode with proper sync
ffmpeg -i input.mp4 -async 1 -c:v copy -c:a aac output_synced.mp4Native Patreon videos (not embeds) require special handling:
# These may not be supported by yt-dlp
# Use patreon-dl or direct download methods
# Check if video is native Patreon
curl -s "https://www.patreon.com/posts/{POST_ID}" | grep -o "cdn.patreon.com"For Vimeo videos embedded in Patreon with privacy settings:
# May need both Patreon and Vimeo cookies
yt-dlp --cookies-from-browser firefox \
--add-header "Referer:https://www.patreon.com/" \
"URL"
# Or extract the embed URL and download separatelyFor YouTube videos that are members-only when embedded:
# Ensure you're logged into YouTube in the same browser
yt-dlp --cookies-from-browser firefox \
"https://www.youtube.com/watch?v={VIDEO_ID}"# HLS URLs often expire quickly
# Capture and download immediately
# If URL expired, re-fetch from page
curl -s "PAGE_URL" | grep -oE "https://[^\"]*\.m3u8[^\"]*"# If some segments fail, try with error tolerance
ffmpeg -err_detect ignore_err \
-i "playlist.m3u8" \
-c copy output.mp4
# Or try with max reload
ffmpeg -protocol_whitelist file,http,https,tcp,tls \
-max_reload 10 \
-i "playlist.m3u8" \
-c copy output.mp4# Full verbose output
yt-dlp --cookies-from-browser firefox -v "URL" 2>&1 | tee debug.log
# Test authentication
yt-dlp --cookies-from-browser firefox --dump-json "URL" | jq '.title, .uploader'
# List all formats with details
yt-dlp --cookies-from-browser firefox -F --verbose "URL"
# Check for embeds
yt-dlp --cookies-from-browser firefox --dump-json "URL" | jq '.entries[] | .url'
# Test specific user agent
yt-dlp --cookies-from-browser firefox \
--user-agent "Mozilla/5.0 (compatible; Googlebot/2.1)" \
--verbose "URL"# Check downloaded video integrity
verify_video() {
local file="$1"
if ! [ -f "$file" ]; then
echo "✗ File not found"
return 1
fi
# Check file size (should be > 0)
local size=$(stat -f%z "$file" 2>/dev/null || stat -c%s "$file")
if [ "$size" -lt 1000 ]; then
echo "✗ File too small: $size bytes"
return 1
fi
# Verify with ffprobe
if ffprobe -v error "$file" > /dev/null 2>&1; then
echo "✓ Video file valid"
return 0
else
echo "✗ Video file corrupted"
return 1
fi
}This research has comprehensively analyzed Patreon's video delivery infrastructure, revealing a multi-layered architecture that includes:
- Native video hosting via CloudFront CDN with session-based authentication
- Third-party embeds primarily from YouTube and Vimeo with their respective CDNs
- Direct file attachments for downloadable content
Key Technical Findings:
- Patreon native videos require session cookie authentication
- Third-party embeds follow standard platform patterns (YouTube, Vimeo)
- HLS streaming is used for adaptive quality delivery
- CDN URLs are often time-limited and signed
Based on our research, we recommend a hierarchical download strategy:
- Primary Method: patreon-dl for Patreon-specific content (95% success rate expected)
- Secondary Method: yt-dlp with cookies for general video extraction
- Tertiary Method: gallery-dl for bulk content archival
- Quaternary Method: FFmpeg for direct HLS stream processing
- Backup Methods: wget/cURL for direct file downloads
Essential Tools:
- patreon-dl: Specialized Patreon downloader with embed support
- yt-dlp: Primary download tool with extensive format support
- ffmpeg: Stream processing, conversion, and analysis
- gallery-dl: Bulk download and archival
Recommended Backup Tools:
- streamlink: For live stream capture
- wget/cURL: Direct HTTP downloads with custom headers
- Browser extensions: Video DownloadHelper, Stream Detector
Infrastructure Tools:
- Docker: Containerized deployment for consistency
- Cron/Task Scheduler: Automated periodic downloads
Optimal performance with:
- Concurrent Downloads: 2-3 simultaneous downloads per IP
- Rate Limiting: 30 requests per minute to avoid throttling
- Retry Logic: Exponential backoff with 3-5 retry attempts
- Quality Selection: 720p provides best balance of quality/size
- Cookie Refresh: Re-export cookies every 2-4 weeks
Important Considerations:
- Respect Patreon's terms of service and creator content rights
- Only download content you have legitimate patron access to
- Implement appropriate rate limiting to avoid service disruption
- Protect session cookies and authentication data
- Consider data protection and privacy requirements
Areas for Continued Development:
- API Integration: Direct Patreon API access for metadata
- Automation: Scheduled downloads for new content
- Quality Optimization: Adaptive quality selection based on bandwidth
- Archive Management: Metadata indexing and search
- Mobile Support: Download capture from mobile apps
Given the dynamic nature of web platforms, this research should be updated regularly:
- Monthly: URL pattern validation and authentication testing
- Quarterly: Tool compatibility and version updates
- Annually: Comprehensive architecture review
Disclaimer: This research is provided for educational and legitimate archival purposes. Users must comply with applicable terms of service, copyright laws, and data protection regulations when implementing these techniques. Only download content you have legitimate access to as a patron.
Last Updated: December 2024
Research Version: 1.0
Next Review: March 2025