An extension-based proxy for Widevine EME challenges and license messages.
Modifies the challenge before it reaches the web player and retrieves the decryption keys from the response.
This fork retains the upstream GPL-3.0 license and adds a subtitle-aware command workflow:
- Captures unprotected HLS, DASH, and Smooth Streaming manifests too, including
playlists requested directly by a native media player, and generates the same
no-key downloader command for them. It also captures a direct
.mp4only when it is explicitly assigned to a video element, never from segment traffic. Public HLS uses its master playlist when one is available and does not invoke Shaka Packager. Its expanded entry reports the manifest runtime when available; thumbnail VTT indexes and duplicate subtitle representations are excluded; when only a JW Player media playlist is exposed, it recovers the public master playlist so your requested quality can be selected; other providers fall back to the highest-bitrate playlist and remove only an incompatible resolution selector; protected streams continue through the existing key workflow. - Detects actual external subtitle files from browser requests and subtitle-specific API or manifest data, retaining the request headers needed for short-lived authenticated links.
- Downloads verified external sidecars beside the video output, converts VTT
files to SRT with
ffmpeg, and uses Jellyfin-ready video-stem-plus-language names such asOnce.en_us.srt,Once.en_gb.srt, orOnce.und.srt. - Collapses duplicate VTT/SRT representations of the same subtitle asset, preferring the browser-requested file.
- Shows clear external-subtitle progress and a final success message, and removes recognized N_m3u8DL-RE work folders only after all output succeeds.
- Keeps the Additional arguments field authoritative, so your N_m3u8DL-RE video, audio, subtitle, and muxing selections are preserved in the generated command.
- Refreshes existing displayed commands when Additional arguments change.
- Offers one optional macOS-only metadata/extras handoff, where you choose either the general Media Metadata and Extras Getter (MME) or the provider-focused Live Performance Metadata and Extras Getter (LPMAEG).
- Automatically supplies the captured original BroadwayHD detail-page URL to an
enabled LPMAEG handoff when it matches
broadwayhd.com/video/<id>; other providers continue to use the manual public detail-page link field. - Refreshes the popup with a compact modern layout, light/dark styling, remembered collapsible settings cards, a unified media/metadata icon, and clearer captured-key controls.
See CHANGELOG.md for the complete, maintained record of fork changes. New behavior is added here only after it has been verified.
- User-friendly / GUI-based
- Bypasses one-time tokens, hashes, and license wrapping
- JavaScript native Widevine implementation
- Supports Widevine Device files
- Manifest V3 compliant
This addon requires a Widevine Device file to work, which is not provided by this project.
- Use an existing Remote CDM like this one
- Follow this guide if you want to dump your own device.
- Ready-to-use Widevine Devices can be found on the VideoHelp forum.
- Compatible (tested) browsers: Firefox/Chrome on Windows/Linux, plus Firefox on macOS.
- Verified macOS development environment: macOS Tahoe 26.5.2 with Firefox 152.0.6. Current development and macOS verification for this fork are done on this configuration.
- The core extension remains cross-platform. This fork's external-subtitle
capture, download, conversion, naming, and cleanup workflow is currently
supported on macOS only; it uses zsh,
curl,ffmpeg, and N_m3u8DL-RE. - The optional LPMAEG handoff is also macOS-only at this time. It invokes the
separately installed LPMAEG launcher through
python3after successful output cleanup. - Works with any service that accepts challenges from Android devices on the same endpoint.
- Chrome
- Download the ZIP file from the releases section
- Navigate to
chrome://extensions/ - Enable
Developer mode - Drag-and-drop the downloaded file into the window
- Firefox
- Persistent installation
- Download the XPI file from the releases section
- Navigate to
about:addons - Click the settings icon and choose
Install Add-on From File... - Select the downloaded file
- Temporary installation
- Download the ZIP file from the releases section
- Navigate to
about:debugging#/runtime/this-firefox - Click
Load Temporary Add-on...and select the downloaded file
- Persistent installation
If you only have a device_client_id_blob and device_private_key, run this command to create a .wvd file:
pywidevine create-device -k device_private_key -c device_client_id_blob -t "ANDROID" -l 3
Now, open the extension, click Choose File and select your Widevine Device file.
If you don't already have a remote.json file, open the API URL in the browser (if provided) and save the response as remote.json.
Now, open the extension, click Choose remote.json and select the JSON file provided by your API.
- Select the type of device you're using in the top right-hand corner
- The files are saved in the extension's
chrome.storage.syncstorage and will be synchronized across any browsers into which the user is signed in with their Google account. - The maximum number of Widevine devices is ~25 OR ~200 Remote CDMs
- Check
Enabledto activate the message interception and you're done.
Play a video in the enabled extension. Protected playback records appear in
Media and Keys with a sparkle beside their URL and reveal the decryption
keys. Public playback appears without the sparkle and provides its manifest,
duration when available, and a no-key download command.
Captured media and protected-stream key records are saved:
- Temporarily until the extension is either refreshed manually (if installed temporarily) or a removal of the keys is manually initiated.
- Permanently in the extension's
chrome.storage.localstorage until manually wiped or exported via the command line.
Note
The video will not play when the interception is active, as the Widevine CDM library isn't able to decrypt the Android CDM license.
- Click the
+button to expand a captured item. Protected media reveals the PSSH and keys; public media reveals its manifest and a no-key command.
In Metadata and Extras Getter, select exactly one tool:
- Media Metadata and Extras Getter (MME) for general media providers; or
- Live Performance Metadata and Extras Getter (LPMAEG) for its supported live-performance providers.
Enable Use, then provide that getter's public detail-page link — not this
extension's stream or manifest URL — and its absolute project-folder path. The
selected getter runs after the N_m3u8DL-RE download, separately captured
subtitles, and work-folder cleanup. It receives the final output folder and uses
--skip-existing, so matching metadata or artwork is not overwritten.
For a BroadwayHD page whose original URL matches
https://broadwayhd.com/video/<id>, leave the public detail-page link blank.
When LPMAEG is selected, the extension recognises that provider-specific page
structure and supplies its captured original page URL automatically. The popup confirms this with
BroadwayHD detail link auto added; a manually entered link always takes
priority.
What if I'm unable to get the keys?
This automatically means that the license server is blocking your CDM and that you either need a CDM from a physical device, a ChromeCDM, or an L1 Android CDM. Don't ask where you can get these
- DRM playback won't work when the extension is disabled and EME Logger is active. This is caused by my fix for dealing with EME Logger interference (solutions are welcome).
Widevineproxy2.webm
- This program is intended solely for educational purposes.
- Do not use this program to decrypt or access any content for which you do not have the legal rights or explicit permission.
- Unauthorized decryption or distribution of copyrighted materials is a violation of applicable laws and intellectual property rights.
- This tool must not be used for any illegal activities, including but not limited to piracy, circumventing digital rights management (DRM), or unauthorized access to protected content.
- The developers, contributors, and maintainers of this program are not responsible for any misuse or illegal activities performed using this software.
- By using this program, you agree to comply with all applicable laws and regulations governing digital rights and copyright protections.