Skip to main content

Stealth HLS stream downloader — bypass Cloudflare, intercept M3U8 playlists, and download videos via browser automation and ffmpeg

Project description

miyuki-dlp

Python 3.11+ PyPI version License: MIT

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)

  1. First run — Browser starts in headless mode. If Cloudflare challenge is detected, it automatically relaunches in headed (visible) mode to solve the challenge.
  2. Cookies saved — Once Cloudflare is cleared, session cookies are persisted to the Chrome profile (~/.miyuki-dlp/chrome-profile).
  3. Subsequent runs — Headless mode works normally using the cached clearance cookies.
  4. Manual override — If auto-detection fails, use --headful to force headed mode from the start.

Pipeline

  1. Browser launch — Patchright launches a real Chrome instance with a persistent profile, avoiding bot detection fingerprints
  2. Page navigation — The browser navigates to the target page while a network listener captures all .m3u8 requests
  3. M3U8 interception — When the video player loads, it requests an HLS master playlist — miyuki-dlp intercepts this URL from network traffic
  4. 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
  5. Quality selection — The master playlist is fetched and parsed to list available resolutions; the user's preferred quality is selected
  6. 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


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

miyuki_dlp-0.3.0.tar.gz (44.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

miyuki_dlp-0.3.0-py3-none-any.whl (23.2 kB view details)

Uploaded Python 3

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

Hashes for miyuki_dlp-0.3.0.tar.gz
Algorithm Hash digest
SHA256 2395f98bf159acb2d3069333820159d733b20346f7b7a8bce8fcaa1f661ecc1c
MD5 c04fd21b9aacec4fa1ce0d8cb7d71e01
BLAKE2b-256 9ef87f11a810d78015a584f8ac200b1a53b03c0dabed5a61e887a72c6b267e23

See more details on using hashes here.

File details

Details for the file miyuki_dlp-0.3.0-py3-none-any.whl.

File metadata

File hashes

Hashes for miyuki_dlp-0.3.0-py3-none-any.whl
Algorithm Hash digest
SHA256 94b29e3a0f5d2c49cf1b0c064537c610638bc3194f9941aa28fe39f9bb8467c3
MD5 3d06297502edb72ba435ee1af1208d49
BLAKE2b-256 c4c92467c28a998efc1377c5264882b77e25a98f3035b2badf9cb64308d9346e

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page