Stealth HLS stream downloader — bypass Cloudflare, intercept M3U8 playlists, and download videos via browser automation and ffmpeg
Project description
miyuki-dlp
Stealth HLS stream downloader that bypasses Cloudflare protection using browser automation. Intercepts M3U8 playlists from network traffic and downloads via ffmpeg — no fragile URL scraping required.
Features
- Cloudflare bypass — Uses Patchright (stealth-patched Playwright) with a real Chrome profile
- Smart auto-detection — Starts headless; auto-relaunches headed if Cloudflare blocks
- Automatic M3U8 interception — Captures playlist URLs from browser network traffic
- UUID fallback — Extracts video UUID from page source when interception fails
- Quality selection — Choose best, worst, or specific resolution (e.g. 720p)
- Parallel downloads — 16 concurrent connections for fast segment downloading
- Multi-URL support — Download multiple videos in a single session
- Rich progress UI — Colorful terminal output with download progress
- ffmpeg integration — Reliable stream download with copy-mux to MP4
Requirements
- Python 3.11+
- ffmpeg — for HLS stream downloading
- Google Chrome — real Chrome browser (not Chromium)
Installation
From PyPI (recommended)
pip install miyuki-dlp
# Install the browser driver (required once)
python -m patchright install chromium
From source
git clone https://github.com/muginami/miyuki-dlp.git
cd miyuki-dlp
pip install -e .
# Install the browser driver (required once)
python -m patchright install chromium
Usage
Basic download
miyuki-dlp https://example.com/video-page
List available qualities
miyuki-dlp --list-qualities https://example.com/video-page
Select specific quality
miyuki-dlp -q 720 https://example.com/video-page
Custom output directory
miyuki-dlp -o ~/videos https://example.com/video-page
Verbose mode (debug logging)
miyuki-dlp -v https://example.com/video-page
Download multiple URLs
miyuki-dlp https://example.com/video-1 https://example.com/video-2
Override output filename
miyuki-dlp --title "my-video" https://example.com/video-page
CLI Reference
usage: miyuki-dlp [-h] [-o OUTPUT] [-q QUALITY] [--headful] [--timeout TIMEOUT]
[--profile PROFILE] [--list-qualities] [--title TITLE]
[-v] [--version]
urls [urls ...]
Stealth HLS stream downloader — bypass Cloudflare, intercept M3U8, download via ffmpeg
positional arguments:
urls Video page URLs to download
options:
-h, --help show this help message and exit
-o, --output OUTPUT Output directory (default: ./downloads)
-q, --quality QUALITY Quality: best, worst, or height like 720, 1080 (default: best)
--headful Force headed browser mode (skip auto-detection)
--timeout TIMEOUT M3U8 interception timeout in seconds (default: 30)
--profile PROFILE Chrome profile directory path
--list-qualities List available qualities and exit
--title TITLE Override output filename
-v, --verbose Verbose/debug logging
--version show program's version number and exit
How It Works
Cloudflare Bypass (Smart Auto-Detection)
- First run — Browser starts in headless mode. If Cloudflare challenge is detected, it automatically relaunches in headed (visible) mode to solve the challenge.
- Cookies saved — Once Cloudflare is cleared, session cookies are persisted to the Chrome profile (
~/.miyuki-dlp/chrome-profile). - Subsequent runs — Headless mode works normally using the cached clearance cookies.
- Manual override — If auto-detection fails, use
--headfulto force headed mode from the start.
Pipeline
- Browser launch — Patchright launches a real Chrome instance with a persistent profile, avoiding bot detection fingerprints
- Page navigation — The browser navigates to the target page while a network listener captures all
.m3u8requests - M3U8 interception — When the video player loads, it requests an HLS master playlist — miyuki-dlp intercepts this URL from network traffic
- UUID fallback — If no M3U8 is captured via network (e.g. lazy-loaded players), miyuki-dlp extracts the video UUID from the page source and constructs the playlist URL directly
- Quality selection — The master playlist is fetched and parsed to list available resolutions; the user's preferred quality is selected
- Parallel download — Segments are downloaded with 16 concurrent HTTP/2 connections, then concatenated and remuxed to MP4 via ffmpeg
Troubleshooting
Cloudflare blocks the request
- The browser auto-relaunches in headed mode if Cloudflare is detected — on first run, a visible browser window is expected
- If auto-detection fails, force headed mode:
--headful - Clear the browser profile:
rm -rf ~/.miyuki-dlp/chrome-profile - Increase timeout:
--timeout 60 - Make sure you have Google Chrome (not just Chromium) installed
ffmpeg not found
Install ffmpeg for your platform:
# macOS
brew install ffmpeg
# Ubuntu/Debian
sudo apt install ffmpeg
# Windows
# Download from https://ffmpeg.org/download.html
M3U8 not captured
- Increase the timeout:
miyuki-dlp --timeout 60 <url> - Run in verbose mode:
miyuki-dlp -v <url> - The page may require interaction (e.g. clicking a play button) — currently not supported automatically
Download fails or produces corrupted file
- Check your ffmpeg version:
ffmpeg -version(v6+ recommended) - The stream may have expired — try re-running the command
- Check disk space in the output directory
License
MIT
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file miyuki_dlp-0.3.0.tar.gz.
File metadata
- Download URL: miyuki_dlp-0.3.0.tar.gz
- Upload date:
- Size: 44.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.5.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2395f98bf159acb2d3069333820159d733b20346f7b7a8bce8fcaa1f661ecc1c
|
|
| MD5 |
c04fd21b9aacec4fa1ce0d8cb7d71e01
|
|
| BLAKE2b-256 |
9ef87f11a810d78015a584f8ac200b1a53b03c0dabed5a61e887a72c6b267e23
|
File details
Details for the file miyuki_dlp-0.3.0-py3-none-any.whl.
File metadata
- Download URL: miyuki_dlp-0.3.0-py3-none-any.whl
- Upload date:
- Size: 23.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.5.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
94b29e3a0f5d2c49cf1b0c064537c610638bc3194f9941aa28fe39f9bb8467c3
|
|
| MD5 |
3d06297502edb72ba435ee1af1208d49
|
|
| BLAKE2b-256 |
c4c92467c28a998efc1377c5264882b77e25a98f3035b2badf9cb64308d9346e
|