Hi,
I'm trying to install playready proxy and play ready proxyapi from ThatNotEasy I wonder if any of you have made it wrk successfully please ?
my PRPApi is launching fine, but my PRP edge plugin don't make any call on the API.
Here is my PRP plugin screen
[Attachment 86164 - Click to enlarge]
Thanks a lot for any help![]()
+ Reply to Thread
Results 1 to 16 of 16
-
-
Seems that extension is still kinda buggy. Hope they fix it. Here's what worked for me without bothering too much. There are 2 directories
- PlayReadyProxy-API-main => the local api
- PlayReadyProxy-main => the extension
Unpack them both. In the local api folder:
- rename the env and config like their git tells you to do
- copy in that folder (near the app.py) the prd file. Mine is called: "your_prd_file.prd"
- then go to config.ini and change
Code:[CDM] DEVICE_FILE = device/ # DEVICE FILENAME DEVICE_NAME = # DEVICE NAME
Code:[CDM] DEVICE_FILE = your_prd_file.prd DEVICE_NAME = your_prd_file.prd
Code:[{"apikey":"secret"}]
* Running on http://127.0.0.1:1337
- go to config folder and open "local.json" . Change
Code:{ "security_level": "", "host": "", "secret": "", "device_name": "" }
Code:{ "security_level": "", "host": "http://127.0.0.1:1337", "secret": "secret", "device_name": "your_prd_file.prd" }
- open the addon menu, make sure "enabled" is checked. Go to remote cdm > choose config and pick the previously edited "local.json" file.
While testing the addon on
https://reference.dashif.org/dash.js/v4.4.0/samples/drm/playready.html
I had to refresh 2 times to get both set of keys (video+audio) and it worked.
[Attachment 86173 - Click to enlarge]
Code:N_m3u8DL-RE "https://media.axprod.net/TestVectors/v7-MultiDRM-MultiKey-MultiPeriod/Manifest.mpd" --key 2d6e938760ca4145aec2c40837b4b026:42d0bff1b60f7be49f17d603484d0cb9 --key 8b029e51d56a44bd910fd4b5fd90fba2:c889cca25eb30b3b128eb834ea4da4fa -M format=mkv
--[----->+<]>.++++++++++++.---.--------.
[*drm mass downloader: widefrog*]~~~~~~~~~~~[*how to make your own mass downloader: guide*] -
May I ask how to use this program?
https://github.com/ready-dl/csplayready -
-
It's a C# implementation. It's not an addon. It even explains you the steps in the readme git section. If you can handle pyplayready, you can handle the C# alternative. If you don't know about scripts, then you can stick only to the addons.
No problem--[----->+<]>.++++++++++++.---.--------.
[*drm mass downloader: widefrog*]~~~~~~~~~~~[*how to make your own mass downloader: guide*] -
I had done all step
but It seems not query the api.
[Attachment 86198 - Click to enlarge]
tried under windows and same thing. do anyone have a clue on what I made wrong please ? -
Code:
try use local.json
Last edited by NBA456017; 18th May 2025 at 17:34.
discord nxhda -
Hello,
Thanks for this tutorial!
I've done everything correctly, I don't get any error messages, and yet it's not working. Any ideas?
[Attachment 87639 - Click to enlarge]
My PlayReady-API -> config.ini :
Code:[CDM] DEVICE_FILE = device/lg_electronics_inc_lg_webos_tv_msd93xbg_sl3000.prd DEVICE_NAME = LG
Code:[ { "username": "test", "apikey": "test_99c036381a6736de600f61c07a" } ]
Code:{ "security_level": "3000", "host": "http://127.0.0.1:1337", "secret": "test_99c036381a6736de600f61c07a", "device_name": "LG" }
Thanks in advance -
Bypass HMACs, One-time-tokens and Lic.Wrapping: https://github.com/DevLARLEY/WidevineProxy2
-
larley the king of video decryption! thank you so much mate for your work. amazing
just little tip: from PR github page on chrome section you write 'download zip'
we have just xpi file, for FF. anyway it's easy to extract all content with wrar or 7zip
loaded extension on chromium browser i get this error 'background.scripts' requires manifest version of 2 or lower -
Bypass HMACs, One-time-tokens and Lic.Wrapping: https://github.com/DevLARLEY/WidevineProxy2
-
yea, right. but why this error from this new extension?
or this error is with chromium browser only and no error with FF browser?
also tried to edit manifest version 3 to version 2 but my browser can't load extension, with manifest version 2
just out curiosity...! -
Among Chromium browsers, I think it is only going to work on Microsoft Edge. In Ungoogled Chromium there is no PlayReady CDM displayed in chrome://media-internals/
I tried implementing some PlayReady-to-ClearKey hook with LLM assistance, but it doesn't work yet and I have no idea how to pass information to jsplayready from content script. Maybe larley can help.
Code:(function () { const originalRequest = navigator.requestMediaKeySystemAccess; navigator.requestMediaKeySystemAccess = async function (keySystem, supportedConfigurations) { if (["com.microsoft.playready.recommendation", "com.microsoft.playready.recommendation.3000", "com.microsoft.playready.hardware", "com.microsoft.playready", "com.youtube.playready"].includes(keySystem)) { const realKeySystem = "org.w3.clearkey"; // Sanitize configurations for compatibility with ClearKey const modifiedConfigs = supportedConfigurations.map(config => { const sanitized = { ...config }; sanitized.videoCapabilities = (config.videoCapabilities || []).map(cap => { const { robustness, ...rest } = cap; return rest; }); sanitized.audioCapabilities = (config.audioCapabilities || []).map(cap => { const { robustness, ...rest } = cap; return rest; }); // Optional: sanitize other fields like distinctiveIdentifier, persistentState, etc. return sanitized; }); const access = await originalRequest.call(navigator, realKeySystem, modifiedConfigs); const originalCreate = access.createMediaKeys.bind(access); const wrappedAccess = { keySystem, getConfiguration: () => access.getConfiguration(), createMediaKeys: async () => { const realMediaKeys = await originalCreate(); return createWrappedMediaKeys(realMediaKeys); } }; return wrappedAccess; } return originalRequest.call(navigator, keySystem, supportedConfigurations); }; function createWrappedMediaKeys(realMediaKeys) { const originalCreateSession = realMediaKeys.createSession.bind(realMediaKeys); realMediaKeys.createSession = function (...args) { const realSession = originalCreateSession(...args); return new Proxy(realSession, { get(target, prop) { if (prop === "generateRequest") { return async (initDataType, initData) => { console.log("[CustomKeySystem] generateRequest", { initDataType, initData }); console.log(Object.keys(initData)); if (initDataType == "cenc") { const data = new Uint8Array(initData); //let pssh = Pssh(initData); console.log(uint8ArrayToString(data)); //const a = uint8ArrayToString(initData); //console.log(Object.keys(initData)); return target.generateRequest("keyids", initData); } return target.generateRequest(initDataType, initData); }; } if (prop === "update") { return async (response) => { console.log("[CustomKeySystem] update", response); // {"keys":[{"kty":"oct","alg":"A128KW","kid":"nrQFDeRLSAKTLifXUIPiZg","k":"FmY0xnWCPCNaSpRG-tUuTQ"}]} return target.update(response); }; } return typeof target[prop] === "function" ? target[prop].bind(target) : target[prop]; } }); }; return realMediaKeys; } })();
-
background and content script communicate through a message proxy that converts one type of event to another and adds a unique id to each one to track which have arrived and which haven't. It's a true pain but also the only way possible.
Code:async function processMessage(detail) { return new Promise((resolve, reject) => { chrome.runtime.sendMessage({type: detail.type, body: detail.body}, (response) => { if (chrome.runtime.lastError) { return reject(chrome.runtime.lastError); } resolve(response); }); }) } document.addEventListener('response', async (event) => { const { detail } = event; const responseData = await processMessage(detail); const responseEvent = new CustomEvent('responseReceived', { detail: detail.requestId.concat(responseData) }); document.dispatchEvent(responseEvent); });
Code:const playready_device = new Device(Utils.base64ToBytes(device_b64)); const cdm = Cdm.fromDevice(playready_device); const licenseChallenge = cdm.getLicenseChallenge(wrmHeader, rawRevLists, version); const returned_keys = cdm.parseLicense(decodedLicense); const keys = returned_keys.map(key => ({ k: utils.bytesToHex(key.key), kid: utils.bytesToHex(key.key_id) }));
Bypass HMACs, One-time-tokens and Lic.Wrapping: https://github.com/DevLARLEY/WidevineProxy2
Similar Threads
-
Free PlayReady SL3000 API
By DRMLab in forum Video Streaming DownloadingReplies: 23Last Post: 2nd Jun 2025, 09:57 -
playready key?
By iamghost in forum Video Streaming DownloadingReplies: 7Last Post: 5th Jul 2024, 09:15 -
Get PSSH for l3.py with PlayReady headers
By Bartie__ in forum Video Streaming DownloadingReplies: 20Last Post: 5th Apr 2024, 15:02 -
Playready
By hencha in forum Video Streaming DownloadingReplies: 11Last Post: 30th Jan 2023, 06:01 -
Playready DRM
By farafero21 in forum Video Streaming DownloadingReplies: 7Last Post: 17th Dec 2021, 15:45