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
.m3u8content 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
.m3u8playlist 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
SUBTITLESandCLOSED-CAPTIONSmedia groups - Shows language, name, and characteristics for each track
- Downloadable as separate
.vttfiles - 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
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
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 usesffmpeg.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
.vttfile - 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
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:webRequestandwebRequestBlocking: Detect HLS playliststabs: Associate playlists with the correct tabdownloads: Save MP4 files to your devicestorage: Persist settings and configuration
The extension never requests additional prompts beyond initial installation. All permissions are declared upfront in the manifest.