Skip to main content

Detection and intake

HLS Downloader provides multiple ways to capture HLS streams:

Automatic HLS sniffing

The extension monitors web requests in real-time and automatically detects HLS playlists:
  • Background listener watches for .m3u8 content types
  • Captures unique playlists per tab with page title and initiator details
  • No manual DevTools inspection required
  • Works as soon as you open a page with HLS content
The extension icon updates when a new playlist is detected, providing visual feedback that captures are available.

Toolbar feedback

When a playlist finishes parsing, the extension updates the toolbar icon for that specific tab to signal that a new capture is available for download.

Direct URL entry

Manually add playlists that weren’t automatically detected:
  • Paste any .m3u8 playlist URL in the Direct tab
  • Creates a playlist entry without network sniffing
  • Useful for JavaScript-loaded streams or manual capture
  • Added playlists are parsed and available immediately

Playlist parsing and selection

Master playlist parsing

The extension fully parses HLS master manifests to extract all available streams:
  • Retrieves master manifests and level playlists
  • Extracts video renditions with bitrate, resolution, and FPS metadata
  • Discovers audio renditions with language, bitrate, and channel information
  • Sorts streams from highest to lowest quality
  • Shows all technical metadata in the UI

Subtitle and closed caption detection

Discovers and exposes subtitle tracks alongside audio and video:
  • Parses SUBTITLES and CLOSED-CAPTIONS media groups
  • Shows language, name, and characteristics for each track
  • Downloadable as separate .vtt files
  • Optional selection (subtitles can be skipped)

Level filtering

Only successfully parsed playlists appear in the UI:
  • Failed or incomplete parses are filtered out
  • Playlists move to “ready” state after successful parsing
  • Ensures all displayed playlists are downloadable

Quality selection

Full control over which streams to download:
  • Pick one video rendition from all available qualities (240p to 4K)
  • Choose a separate audio rendition when available
  • Optionally select subtitle or closed caption tracks
  • View technical metadata for informed selection

Metadata visibility

Detailed information for each stream level:
  • Full URIs for video, audio, and subtitle playlists
  • Resolution (width × height)
  • Bitrate in mbps
  • Frame rate (fps)
  • Audio language codes
  • Channel count (e.g., 2ch, 6ch)
  • Default and auto-select flags
Use the clipboard icon next to each track selector to copy the stream URL directly to your clipboard.

Download pipeline

The extension implements a robust multi-stage download pipeline:

Fragment discovery

Once you start a download, the extension:
  • Fetches level playlists for selected video and audio streams
  • Enumerates all fragments with absolute URLs
  • Identifies initialization segments when present
  • Builds a complete fragment list for download

Resilient fetching

Downloads are optimized for speed and reliability:
  • Configurable parallelism (concurrency) balances speed and stability
  • Each fragment supports retry attempts (configurable in Settings)
  • Failed fragments are automatically retried
  • Progress tracking shows completed vs. total fragments
Increase concurrency for faster downloads on stable connections. Reduce it if you experience frequent fetch failures.

Decryption

Built-in support for encrypted streams:
  • AES-128 encrypted fragments are automatically detected
  • Decryption keys and IVs are extracted from playlists
  • Web Crypto API performs decryption locally in your browser
  • No external services or uploads required
Some encryption methods (like DRM) are not supported. The extension checks encryption compatibility before allowing downloads.

Local storage buckets

All downloaded data stays in your browser:
  • Video and audio fragments are written to IndexedDB
  • Buckets are keyed by job ID for isolation
  • Nothing is uploaded to external servers
  • Data remains private and local

FFmpeg-based muxing

The extension uses ffmpeg.wasm to merge streams:
  • Runs entirely in your browser tab via WebAssembly
  • Concatenates and muxes audio + video fragments into MP4
  • Supports video-only or audio-only cases gracefully
  • No server-side processing required
Muxing large videos can take several minutes. Progress is shown in the Downloads tab while ffmpeg works.

Offscreen support for MV3

Chromium-based browsers using Manifest V3:
  • Creates an offscreen document for blob URL generation
  • Prevents service worker blocking
  • Ensures smooth download triggering

Save flow

Final step to get your video:
  • Uses browser Downloads API to save the MP4
  • Honors your save dialog preference from Settings
  • Automatically uniquifies filenames to avoid conflicts
  • Filenames are generated from page title and metadata

Subtitle export

When a subtitle or closed caption track is selected:
  • Fetches the subtitle playlist
  • Concatenates segments into a single .vtt file
  • Saves via the browser Downloads API
  • Saved separately from the video file

User interface modules

The extension popup is divided into functional tabs:

Sniffer tab

Manage detected playlists:
  • Lists all playlists detected from the current page
  • Filter by title, URL, or initiator
  • Copy all playlist URLs to clipboard
  • Clear all detected playlists
  • Drill into individual playlists to select tracks
  • Manual URL input for direct playlist addition

Direct tab

Alternative interface for manual playlist management:
  • Accepts manual playlist URLs
  • Lists resulting parsed entries
  • Selection and download workflow

Playlist view

Track selection interface:
  • Shows available video, audio, and subtitle levels
  • Dropdown selectors for each track type
  • Displays technical metadata for informed choices
  • Copy buttons for stream URLs
  • Download button to start the job

Downloads tab

Monitor and manage download jobs:
  • Shows active and finished jobs
  • Progress bars and percentage indicators
  • Status badges (queued, downloading, ready, error)
  • Job actions (cancel, delete, retry, save as)
  • Filter to search through download history

Settings tab

Configure extension behavior:
  • Active downloads: Limit concurrent jobs (1-10 or unlimited)
  • Fragment concurrency: Parallel fragment fetches
  • Fetch attempts: Retry count per fragment
  • Save dialog: Toggle save location prompt
  • Preferred audio language: Auto-select audio by language code

About tab

Extension information and links:
  • Version number
  • Quick links to GitHub issues, source code, privacy policy, and license
  • Contribution information

Persistence and cleanup

Config persistence

Your settings are saved across sessions:
  • Concurrency settings
  • Fetch attempt configuration
  • Save dialog preference
  • Preferred audio language
  • Stored in extension storage and restored on startup

Bucket cleanup

Automatic storage management:
  • Startup cleanup epic runs when extension loads
  • Clears IndexedDB buckets based on cached metadata
  • Prevents stale storage accumulation
  • Keeps your browser clean

Non-persistence of jobs and playlists

Playlists and download jobs currently live in memory only. They are cleared when the extension reloads or the browser restarts.

Build and compatibility

The extension supports multiple browsers and manifest versions:

Manifest variants

  • MV2: For Firefox and legacy Chromium workflows
  • MV3: For modern Chromium-based browsers (Chrome, Brave, Edge, Arc, Opera)
  • MV3 uses offscreen documents for blob URL creation

Browser coverage

Verified to work on:
  • Firefox (via Firefox Add-ons or manual install)
  • Google Chrome (manual install, experimental)
  • Microsoft Edge (via Edge Add-ons)
  • Brave (manual install)
  • Arc (manual install)
  • Opera (manual install)
  • Other Chromium-based browsers

Cross-platform support

Works on Windows, macOS, and Linux with any supported browser.

Privacy and security

100% local processing

All operations happen in your browser:
  • Fragment downloads go directly to your device
  • Decryption uses local Web Crypto API
  • FFmpeg runs via WebAssembly in your tab
  • No data is uploaded to external servers

No tracking or telemetry

The extension does not collect any usage data, analytics, or personal information.

Minimal permissions

Required permissions are limited to:
  • webRequest and webRequestBlocking: Detect HLS playlists
  • tabs: Associate playlists with the correct tab
  • downloads: Save MP4 files to your device
  • storage: Persist settings and configuration
The extension never requests additional prompts beyond initial installation. All permissions are declared upfront in the manifest.

Build docs developers (and LLMs) love