An open API service indexing awesome lists of open source software.

https://github.com/serpapps/patreon-downloader

Download Patraon videos directly to your local computer for offline viewing & easy backing up of your media.
https://github.com/serpapps/patreon-downloader

patreon-downloader patreon-video-downloader

Last synced: 3 months ago
JSON representation

Download Patraon videos directly to your local computer for offline viewing & easy backing up of your media.

Awesome Lists containing this project

README

          

# Patreon Video Stream Downloader (Browser Extension for Chrome, Firefox, Opera, Edge)

> Download Patreon videos directly to your local computer for offline viewing & easy backing up of your media.

The Patreon Video Downloader gives you complete local control over saving videos you already have access to.
There are no servers, no logging, and no tracking β€” all detection and downloading happen directly on your device for maximum privacy.

Whether you’re saving your own paid content, backing up lessons, or organizing important videos for offline use, our downloader is engineered to be safe, stable, and incredibly easy to use.

## πŸ”— Links

- 🎁 Get it [here](https://serp.ly/Patreon-downloader)
- ❓ Check FAQs [here](https://github.com/orgs/serpapps/discussions/categories/faq)
- πŸ› Report bugs [here](https://github.com/serpapps/Patreon-downloader/issues)
- πŸ†• Request features [here](https://github.com/serpapps/Patreon-downloader/issues)

### Resources

- πŸ’¬ [Community](https://serp.ly/@serp/community)
- πŸ’Œ [Newsletter](https://serp.ly/@serp/email)
- πŸ›’ [Shop](https://serp.ly/@serp/store)
- πŸŽ“ [Courses](https://serp.ly/@serp/courses)

## Features & Planned Functionality

- Multi-browser compatability (Chrome, Brave, Edge, Arc, Opera, Firefox)
- VPNs & proxy compatible (recommended for privacy)
- Media auto detection
- Download progress indicators
- One-click downloads
- No watermarks added
- No ads
- Regular updates
- 100% privacy-friendly
- Zero data tracking
- Media download customization
- Concurrent downloads
- Lifetime access & updates
- Auto-rename files based on video titles
- Batch download queue support
- Lightweightβ€”minimal CPU/RAM usage
- Thumbnail & metadata extraction
- Support for long videos
- Multiple resolution download options (when available)
- Bulk downloading

## FAQs

### Can I download private videos?

The rule of thumb is this: If you have access to the video - aka you are able to watch the video in your browser, you can download it. If it requires a password you don't have, and you are not able to watch the video you canno't download it.

### How many videos can I download?

Once you purchase the our downloader extension, you have access to it and future upgrades for life - you can download as many videos as you want.

### Do you track what I download?

No. Everything happens locally on your computer and is not sent to our servers.

### Where are the downloads saved?

The videos are saved to whatever folder you have set to download to in your browser's settings. Usually this is your Downloads folder by default.

### How long does it take to download?

It depends on the size of the video you are trying to download and your internet speed (among other things). Most videos download very quickly, but longer videos (hours more) and higher resolutions will increase download times

### Is my data private?

All detection and conversion happen locally. Only licence checks touch our servers. No viewing history or passwords are stored.

We recommend using our [SERP VPN](https://serp.ly/serp-vpn) extension to hide your IP and location.

### Is this legal?

**DISCLAIMER:** We are not attorneys and do not offer legal advice. Laws vary by country and platform. For any legal question please consult a qualified legal professional.

We give you full control over download speeds because we believe users should decide how they use their software.

That said, here are a few widely accepted best practices for safe, responsible downloading:

1. Only download content you created, own, or have explicit permission from the rights holder to access.
2. Protect your personal data by respecting platform rules and rate limits with reasonable download speeds to avoid automated abuse systems putting your account at risk.
3. Protect your privacy by using a reputable VPN for IP protection before initiating downloads β€” [this is the VPN we recommend & use](https://serp.ly/best/vpn).

### Do you offer refunds?

See our [refund policy](https://github.com/serpapps/legal/blob/main/refund-policy.md) for the most up-to-date answer to that question. TLDR: Our downloaders work. If you have a problem with something not working, we will fix it or give you a refund.

### It says β€œNo video found” β€” what do I do?

Try:

1. Reloading the page & clicking play on the video so that it can play for a few seconds before clicking the extension.
2. Using a VPN (some regions hide media files)

## Related

- [Repository](https://github.com/serpapps/patreon-downloader)
- [Release](https://gist.github.com/devinschumacher/94b7816b449ae5e5371961a44384985e)
- [How to Download Patreon Videos](https://gist.github.com/devinschumacher/14061551eb17cc8932b6802cfc0ca178)


Research

# Patreon Video Download Research: Technical Analysis of Stream Patterns, CDNs, and Download Methods

*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

---

## Abstract

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.

## Table of Contents

1. [Introduction](#1-introduction)
2. [Patreon Video Infrastructure Overview](#2-patreon-video-infrastructure-overview)
3. [Embed URL Patterns and Detection](#3-embed-url-patterns-and-detection)
4. [Stream Formats and CDN Analysis](#4-stream-formats-and-cdn-analysis)
5. [yt-dlp Implementation Strategies](#5-yt-dlp-implementation-strategies)
6. [FFmpeg Processing Techniques](#6-ffmpeg-processing-techniques)
7. [Patreon-dl Tool Implementation](#7-patreon-dl-tool-implementation)
8. [Alternative Tools and Backup Methods](#8-alternative-tools-and-backup-methods)
9. [Implementation Recommendations](#9-implementation-recommendations)
10. [Troubleshooting and Edge Cases](#10-troubleshooting-and-edge-cases)
11. [Conclusion](#11-conclusion)

---

## 1. Introduction

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.

### 1.1 Research Scope

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

### 1.2 Methodology

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

---

## 2. Patreon Video Infrastructure Overview

### 2.1 Video Hosting Types

Patreon supports multiple video hosting mechanisms:

#### 2.1.1 Native Patreon Video
- 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

#### 2.1.2 Third-Party Embedded Videos
- YouTube embeds via iframe
- Vimeo embeds via iframe
- Other providers through Embed.ly integration

#### 2.1.3 Direct File Attachments
- Downloadable video files attached to posts
- Direct download links for patrons

### 2.2 CDN Architecture

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`

### 2.3 Video Processing Pipeline

Patreon's native video processing follows this pipeline:
1. **Upload**: Original video uploaded to Patreon servers
2. **Transcoding**: Multiple formats and quality levels generated
3. **Quality Levels**: Auto-generated 480p, 720p, 1080p variants
4. **CDN Distribution**: Files distributed across CloudFront network
5. **Adaptive Streaming**: HLS manifests created for dynamic quality

### 2.4 Security and Access Control

- **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

---

## 3. Embed URL Patterns and Detection

### 3.1 Patreon Post URL Patterns

#### 3.1.1 Standard Post URLs
```
https://www.patreon.com/posts/{POST_ID}
https://www.patreon.com/posts/{POST_TITLE}-{POST_ID}
https://patreon.com/posts/{POST_ID}
```

#### 3.1.2 Creator Page URLs
```
https://www.patreon.com/{CREATOR_NAME}
https://www.patreon.com/c/{CREATOR_NAME}
https://www.patreon.com/user?u={USER_ID}
```

#### 3.1.3 Direct Media URLs (Native Patreon Video)
```
https://cdn.patreon.com/video/{UNIQUE_ID}/filename.mp4
https://stream.patreon.com/{PATH}/{FILENAME}.m3u8
```

### 3.2 Third-Party Embed Patterns

#### 3.2.1 YouTube Embed URLs
```
https://www.youtube.com/embed/{VIDEO_ID}
https://www.youtube.com/watch?v={VIDEO_ID}
https://youtu.be/{VIDEO_ID}
```

#### 3.2.2 Vimeo Embed URLs
```
https://player.vimeo.com/video/{VIDEO_ID}
https://player.vimeo.com/video/{VIDEO_ID}?h={HASH}
https://vimeo.com/{VIDEO_ID}
```

#### 3.2.3 Vimeo HLS Stream URLs
```
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
```

### 3.3 Video ID and URL Extraction Patterns

#### 3.3.1 Regex Patterns for URL Extraction

**Patreon Post ID:**
```regex
patreon\.com/posts/(?:[^-]+-)?(\d+)
patreon\.com/posts/(\d+)
```

**YouTube Video ID:**
```regex
(?:youtube\.com/(?:watch\?v=|embed/)|youtu\.be/)([A-Za-z0-9_-]{11})
```

**Vimeo Video ID:**
```regex
(?:player\.)?vimeo\.com/(?:video/)?(\d+)
```

**General Video URL Pattern:**
```regex
https?://(?:player\.|www\.)?(youtube\.com|youtu\.be|vimeo\.com)/(?:watch\?v=|video/|embed/|channels/\w+/)?([A-Za-z0-9._%-]+)
```

### 3.4 Detection Implementation

#### Command-line URL Extraction Methods

**Extract Patreon post IDs from HTML:**
```bash
# 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:**
```bash
# 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.html
```

**Using yt-dlp for detection and metadata extraction:**
```bash
# 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}"
```

---

## 4. Stream Formats and CDN Analysis

### 4.1 Native Patreon Video Formats

#### 4.1.1 Supported Upload Formats
- **Container**: MP4, MOV, MPEG, OGG
- **Maximum Size**: 5GB per file
- **Duration**: Varies by tier (limited monthly hours)

#### 4.1.2 Transcoded Output Formats
- **Container**: MP4
- **Video Codec**: H.264 (AVC)
- **Audio Codec**: AAC
- **Quality Levels**: 480p, 720p, 1080p (device/bandwidth adaptive)
- **Streaming**: HTTP Live Streaming (HLS)

### 4.2 HLS Stream Structure

#### 4.2.1 Master Playlist (m3u8)
```
#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
```

#### 4.2.2 Quality-Specific Playlists
```
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:6
#EXTINF:6.006,
segment001.ts
#EXTINF:6.006,
segment002.ts
...
#EXT-X-ENDLIST
```

### 4.3 Vimeo Embed Stream Patterns

#### 4.3.1 VimeoCDN URL Structure
```
https://vod-adaptive-ak.vimeocdn.com/exp={TIMESTAMP}~hmac={HMAC}/{VIDEO_ID}/v2/playlist/av/primary/playlist.m3u8
```

Components:
- `exp`: Expiration timestamp
- `hmac`: Hash-based message authentication code
- `VIDEO_ID`: Numeric video identifier
- Query parameters: `qsr`, `pathsig` for additional security

#### 4.3.2 Akamai CDN Patterns
```
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
```

### 4.4 Quality Variants Analysis

| 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 |

### 4.5 CDN Endpoint Testing

```bash
# 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"
```

---

## 5. yt-dlp Implementation Strategies

### 5.1 Installation

```bash
# 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-dlp
```

### 5.2 Authentication Methods

#### 5.2.1 Cookie-based Authentication (Recommended)

**Export cookies from browser:**
```bash
# 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:**
1. Install browser extension "Get cookies.txt LOCALLY"
2. Navigate to patreon.com while logged in
3. Export cookies to file `patreon_cookies.txt`
4. Use with yt-dlp via `--cookies` option

#### 5.2.2 Session Cookie Format (Netscape)
```
# Netscape HTTP Cookie File
.patreon.com TRUE / TRUE 1700000000 session_id abc123...
.patreon.com TRUE / FALSE 1700000000 patreon_device_id xyz789...
```

### 5.3 Basic Download Commands

#### 5.3.1 Standard Download
```bash
# 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}"
```

#### 5.3.2 Format Selection
```bash
# 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}"
```

#### 5.3.3 Advanced Options
```bash
# 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}"
```

### 5.4 Batch Processing

#### 5.4.1 From URL File
```bash
# 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
```

#### 5.4.2 Rate-Limited Batch Download
```bash
# 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.txt
```

### 5.5 Configuration File

Create `~/.config/yt-dlp/config`:
```yaml
# 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"
```

### 5.6 Error Handling

```bash
# 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"
```

---

## 6. FFmpeg Processing Techniques

### 6.1 Installation

```bash
# Ubuntu/Debian
sudo apt-get install ffmpeg

# macOS
brew install ffmpeg

# Windows (via Chocolatey)
choco install ffmpeg
```

### 6.2 Stream Analysis with ffprobe

#### 6.2.1 Basic Stream Information
```bash
# 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"
```

#### 6.2.2 HLS/m3u8 Stream Analysis
```bash
# 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"
```

### 6.3 HLS Stream Download

#### 6.3.1 Basic m3u8 to MP4 Conversion
```bash
# 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
```

#### 6.3.2 With Authentication Headers
```bash
# 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
```

#### 6.3.3 Quality-Specific Download
```bash
# 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
```

### 6.4 Stream Conversion and Processing

#### 6.4.1 Format Conversion
```bash
# 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
```

#### 6.4.2 Audio Bitstream Filter
```bash
# Fix AAC audio for MP4 container
ffmpeg -i "playlist.m3u8" -c copy -bsf:a aac_adtstoasc output.mp4
```

#### 6.4.3 Resolution Adjustment
```bash
# 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
```

### 6.5 Audio/Video Stream Handling

#### 6.5.1 Extract Audio Only
```bash
# 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
```

#### 6.5.2 Extract Video Only
```bash
# Video without audio
ffmpeg -i input.mp4 -an -c:v copy video_only.mp4
```

#### 6.5.3 Merge Separate Streams
```bash
# 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
```

### 6.6 Troubleshooting Commands

```bash
# 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.mp4
```

---

## 7. Patreon-dl Tool Implementation

### 7.1 Overview

patreon-dl is a specialized Node.js-based command-line tool designed specifically for downloading content from Patreon posts, including support for embedded video extraction.

### 7.2 Installation

```bash
# Prerequisites
# - Node.js v20 or higher
# - FFmpeg (recommended)

# Install globally via npm
npm i -g patreon-dl

# Verify installation
patreon-dl --version
```

### 7.3 Basic Usage

#### 7.3.1 Download Single Post
```bash
# 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}"
```

#### 7.3.2 Download Creator Content
```bash
# Download all posts from creator
patreon-dl --cookie "your_session_cookie" \
--out-dir ./downloads \
"https://www.patreon.com/{CREATOR_NAME}"
```

### 7.4 CLI Options

| Option | Description |
|--------|-------------|
| `--cookie ` | Patreon session cookie for authentication |
| `--ffmpeg ` | Path to FFmpeg binary |
| `--config-file ` | Path to configuration file |
| `--out-dir ` | Output directory for downloads |
| `--log-level ` | Logging verbosity (info, debug, warn, error) |
| `--no-prompt` | Skip confirmation prompts |
| `--dry-run` | Test without saving files |
| `--deno ` | Path to Deno binary (for YouTube Premium) |

### 7.5 Configuration File

#### 7.5.1 Basic Configuration
```ini
[downloader]
path.to.ffmpeg = "/usr/bin/ffmpeg"
path.to.deno = "/usr/bin/deno"

[output]
directory = "./downloads"
filename.template = "{post.title}"
```

#### 7.5.2 External Downloader Configuration (example-embed.conf)
```ini
# 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}"
```

#### 7.5.3 Template Variables
- `{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

### 7.6 Session Cookie Extraction

**From Browser Developer Tools:**
1. Open patreon.com in browser
2. Login to your account
3. Open Developer Tools (F12)
4. Go to Application/Storage β†’ Cookies
5. Find `session_id` cookie
6. Copy the value

**Using browser extensions:**
1. Install "EditThisCookie" or similar
2. Navigate to patreon.com
3. Export cookies in Netscape format

### 7.7 Advanced Usage

```bash
# 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}"
```

---

## 8. Alternative Tools and Backup Methods

### 8.1 gallery-dl

gallery-dl is a powerful cross-platform tool for downloading images and videos from many content platforms including Patreon.

#### 8.1.1 Installation
```bash
# Using pip
python3 -m pip install -U gallery-dl

# Using Homebrew (macOS)
brew install gallery-dl

# Using Snap (Linux)
snap install gallery-dl
```

#### 8.1.2 Patreon Usage
```bash
# 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}"
```

#### 8.1.3 Configuration
Create `~/.config/gallery-dl/config.json`:
```json
{
"extractor": {
"patreon": {
"cookies": ["firefox"],
"directory": ["patreon", "{creator[vanity]}"],
"filename": "{id}_{title}.{extension}",
"videos": true,
"postfiles": true
}
}
}
```

### 8.2 Streamlink

Streamlink specializes in live streams but can handle recorded content on supported platforms.

#### 8.2.1 Installation
```bash
# Using pip
pip install streamlink

# Using Homebrew (macOS)
brew install streamlink
```

#### 8.2.2 Usage
```bash
# 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.mp4
```

**Note:** Streamlink has limited direct Patreon support. It works best when you have the direct HLS stream URL.

### 8.3 wget/cURL for Direct Downloads

#### 8.3.1 Direct File Downloads
```bash
# 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"
```

#### 8.3.2 HLS Segment Download
```bash
# 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 {}
```

### 8.4 Browser Developer Tools Method

#### 8.4.1 Manual Network Inspection
1. Open browser Developer Tools (F12)
2. Navigate to Network tab
3. Filter by "mp4", "m3u8", or "media"
4. Play the Patreon video
5. Identify video stream URLs
6. Right-click β†’ Copy as cURL

#### 8.4.2 Extract URLs from HAR Export
```bash
# Export HAR file from browser
# Extract video URLs
grep -oE "https://[^\"]*\.(mp4|m3u8|ts)[^\"]*" network_export.har | sort -u
```

### 8.5 Browser Extensions

Recommended browser extensions for video extraction:
- **Video DownloadHelper** (Firefox/Chrome)
- **Patreon Downloader** (Chrome) - For downloadable attachments
- **Stream Detector** (Firefox) - Detects HLS streams

### 8.6 Tool Comparison

| 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 |

---

## 9. Implementation Recommendations

### 9.1 Primary Implementation Strategy

#### 9.1.1 Recommended Tool Hierarchy
1. **patreon-dl**: Primary tool for Patreon-specific content
2. **yt-dlp**: Secondary for embedded videos (YouTube, Vimeo)
3. **gallery-dl**: Backup for bulk content
4. **FFmpeg**: For direct HLS stream processing
5. **wget/cURL**: Last resort for direct file URLs

#### 9.1.2 Hierarchical Download Script
```bash
#!/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
```

### 9.2 Quality Selection Strategy

```bash
# 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"
}
```

### 9.3 Batch Processing

#### 9.3.1 Batch Download Script
```bash
#!/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!"
```

#### 9.3.2 Parallel Download with Rate Limiting
```bash
# 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.txt
```

### 9.4 Error Handling and Resilience

#### 9.4.1 Retry Logic
```bash
download_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
}
```

#### 9.4.2 Cookie Refresh Detection
```bash
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
}
```

### 9.5 Logging and Monitoring

```bash
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
}
```

---

## 10. Troubleshooting and Edge Cases

### 10.1 Common Issues and Solutions

#### 10.1.1 Authentication Errors

**Issue: "Login required" or "Private content"**
```bash
# 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 export
```

**Issue: Cookie expiration**
```bash
# 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 days
```

#### 10.1.2 Rate Limiting

**Issue: "Too many requests" errors**
```bash
# 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**
```bash
# 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"
```

#### 10.1.3 Format/Codec Issues

**Issue: No video formats available**
```bash
# 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 first
```

**Issue: Audio/video sync problems**
```bash
# Re-encode with proper sync
ffmpeg -i input.mp4 -async 1 -c:v copy -c:a aac output_synced.mp4
```

### 10.2 Platform-Specific Edge Cases

#### 10.2.1 Native Patreon Video

Native Patreon videos (not embeds) require special handling:

```bash
# 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"
```

#### 10.2.2 Vimeo Private Embeds

For Vimeo videos embedded in Patreon with privacy settings:

```bash
# 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 separately
```

#### 10.2.3 YouTube Members-Only Content

For YouTube videos that are members-only when embedded:

```bash
# Ensure you're logged into YouTube in the same browser
yt-dlp --cookies-from-browser firefox \
"https://www.youtube.com/watch?v={VIDEO_ID}"
```

### 10.3 HLS Stream Issues

#### 10.3.1 Expired Stream URLs
```bash
# HLS URLs often expire quickly
# Capture and download immediately

# If URL expired, re-fetch from page
curl -s "PAGE_URL" | grep -oE "https://[^\"]*\.m3u8[^\"]*"
```

#### 10.3.2 Segmented Stream Recovery
```bash
# 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
```

### 10.4 Diagnostic Commands

```bash
# 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"
```

### 10.5 File Integrity Verification

```bash
# 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
}
```

---

## 11. Conclusion

### 11.1 Summary of Findings

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

### 11.2 Recommended Implementation Approach

Based on our research, we recommend a **hierarchical download strategy**:

1. **Primary Method**: patreon-dl for Patreon-specific content (95% success rate expected)
2. **Secondary Method**: yt-dlp with cookies for general video extraction
3. **Tertiary Method**: gallery-dl for bulk content archival
4. **Quaternary Method**: FFmpeg for direct HLS stream processing
5. **Backup Methods**: wget/cURL for direct file downloads

### 11.3 Tool Recommendations

**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

### 11.4 Performance Considerations

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

### 11.5 Security and Compliance Notes

**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

### 11.6 Future Research Directions

**Areas for Continued Development:**
1. **API Integration**: Direct Patreon API access for metadata
2. **Automation**: Scheduled downloads for new content
3. **Quality Optimization**: Adaptive quality selection based on bandwidth
4. **Archive Management**: Metadata indexing and search
5. **Mobile Support**: Download capture from mobile apps

### 11.7 Maintenance and Updates

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