-
Notifications
You must be signed in to change notification settings - Fork 44
Description
I'm developing an Electron-based macOS application that uses Widevine CDM to play DRM-protected videos. Despite correctly configuring the Widevine CDM files and entitlements, the Widevine initialization fails with NotSupportedError: Unsupported keySystem or supportedConfigurations, preventing video playback.
I'm using Electron 35.1.5+wvcus (Chromium 134) with Widevine CDM 4.10.2891.0, which is marked as supported in your compatibility table (Electron Releases). The Widevine files are correctly detected, and the signature is verified, but the initialization fails.
Environment
Electron Version: 35.1.5+wvcus (Chromium 134)
Widevine CDM Version: 4.10.2891.0
OS: macOS (ARM64)
Node.js Version: 20.10.0
electron-builder Version: 26.0.12
Steps to Reproduce
Set up an Electron app with the following package.json dependencies:
"devDependencies": {
"@castlabs/electron-releases": "https://github.com/castlabs/electron-releases#v35.1.5+wvcus",
"electron": "github:castlabs/electron-releases#v35.1.5+wvcus",
...
}
Place Widevine CDM 4.10.2891.0 files in WidevineCdm/4.10.2891.0/ with the structure:
WidevineCdm/
└── 4.10.2891.0/
├── manifest.json
└── _platform_specific/
└── mac_arm64/
├── libwidevinecdm.dylib
└── libwidevinecdm.dylib.sig
Configure electron-builder to copy WidevineCdm to Contents/Resources/WidevineCdm:
"extraResources": [
{
"from": "WidevineCdm",
"to": "WidevineCdm"
}
]
Set macOS entitlements in entitlements.mac.plist:
com.apple.security.cs.allow-unsigned-executable-memory
com.apple.security.cs.allow-jit
com.apple.security.cs.allow-dyld-environment-variables
com.apple.security.cs.disable-library-validation
com.apple.security.temporary-exception.mach-lookup.global-name
com.apple.widevinecdm
In main.js, configure Widevine and attempt initialization:
const widevineDir = process.env.NODE_ENV === 'development'
? path.join(app.getPath('userData'), 'WidevineCdm')
: path.join(path.dirname(app.getPath('exe')), '..', 'Resources', 'WidevineCdm');
app.commandLine.appendSwitch('widevine-cdm-path', widevineDir);
app.commandLine.appendSwitch('widevine-cdm-version', '4.10.2891.0');
mainWindow.webContents.executeJavaScript(navigator.requestMediaKeySystemAccess("com.widevine.alpha", [{ initDataTypes: ["cenc"], videoCapabilities: [{ contentType: "video/mp4; codecs=\\"avc1.64001E\\"", robustness: "" }], audioCapabilities: [{ contentType: "audio/mp4; codecs=\\"mp4a.40.2\\"", robustness: "" }], persistentState: "optional", sessionTypes: ["temporary"] }]).then((mediaKeySystemAccess) => { console.log('✅ Widevine initialized!'); }).catch((err) => { console.error('❌ Failed to initialize Widevine:', err.name, err.message); }););
Build and run the app, then attempt to play a DRM-protected video.
Expected Behavior
Widevine CDM should initialize successfully, allowing DRM-protected videos to play on sites without the error "Ihr Browser unterstützt diesen Medientyp nicht."
Actual Behavior
Widevine initialization fails with:
❌ Failed to initialize Widevine: NotSupportedError Unsupported keySystem or supportedConfigurations.
It displays the error indicating DRM is not enabled.
Steps Tried
Verified Widevine Files:
Confirmed WidevineCdm/4.10.2891.0/ contains manifest.json, libwidevinecdm.dylib, and libwidevinecdm.dylib.sig.
Signature verification passes (main.js: Widevine CDM signature verified).
Inspected manifest.json to ensure it includes avc1, mp4a, cenc, and robustness levels like SW_SECURE_CRYPTO.
Updated Widevine Configuration:
Tried alternative codecs (avc1.4d401e, avc1.42e01e) and robustness levels (SW_SECURE_CRYPTO, HW_SECURE_ALL):
navigator.requestMediaKeySystemAccess("com.widevine.alpha", [
{
initDataTypes: ["cenc"],
videoCapabilities: [{
contentType: "video/mp4; codecs=\"avc1.4d401e\"",
robustness: "SW_SECURE_CRYPTO"
}],
audioCapabilities: [{
contentType: "audio/mp4; codecs=\"mp4a.40.2\"",
robustness: "SW_SECURE_CRYPTO"
}],
persistentState: "optional",
sessionTypes: ["temporary"]
},
{
initDataTypes: ["cenc"],
videoCapabilities: [{
contentType: "video/mp4; codecs=\"avc1.42e01e\"",
robustness: "HW_SECURE_ALL"
}],
audioCapabilities: [{
contentType: "audio/mp4; codecs=\"mp4a.40.2\"",
robustness: "HW_SECURE_ALL"
}],
persistentState: "optional",
sessionTypes: ["temporary"]
},
{
initDataTypes: ["cenc"],
videoCapabilities: [{
contentType: "video/mp4",
robustness: ""
}],
audioCapabilities: [{
contentType: "audio/mp4",
robustness: ""
}],
persistentState: "optional",
sessionTypes: ["temporary"]
}
])
Still received NotSupportedError.
Checked Entitlements:
Confirmed entitlements.mac.plist includes all necessary Widevine permissions, including com.apple.widevinecdm.
Spoofed User Agent:
Set user agent to mimic Chrome:
app.userAgentFallback = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 14_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36';
Applied to both BrowserWindow and BrowserView.
Disabled WebRTC:
Added --disable-features=WebRTC to prevent browser fingerprinting.
Reviewed Network and Session Issues:
Ensured stable internet connection.
Noted that browserViewManager.js loads without session data, but authentication appears to work for page loading.
Checked Build Configuration:
Verified package.json and electron-builder settings to ensure Widevine files are correctly copied and no build flags disable DRM.
Questions
Are there known issues with Widevine CDM 4.10.2891.0 and Electron 35.1.5+wvcus (Chromium 134) that could cause NotSupportedError?
Does the +wvcus build require specific navigator.requestMediaKeySystemAccess configurations (e.g., codecs, robustness levels) ?
Are there additional entitlements or command-line switches needed for Widevine in Electron 35.x?
Could BrowserView configuration affect Widevine initialization? If so, what webPreferences are required?
Is there a recommended Widevine configuration video playback with this setup?
Additional Information
The app uses BrowserView to load pages, with browserViewManager.js handling session data and API request blocking. videos fail with the DRM error, suggesting Widevine is not fully enabled.
The manifest.json includes avc1, mp4a, cenc, and robustness levels like SW_SECURE_CRYPTO and HW_SECURE_ALL.
Logs confirm Widevine files are detected and signed correctly.
Any guidance on resolving the NotSupportedError or enabling Widevine for video playback would be greatly appreciated!