@FoxRefire
congratulations I haven't seen such a beautiful and important work in quite some time.
I wanted to ask you are there any other services the non standard ones that use json sending is it possible to do something?
Try StreamFab Downloader and download from Netflix, Amazon, Youtube! Or Try DVDFab and copy Blu-rays!
Try StreamFab Downloader and download streaming video from Youtube, Netflix, Amazon! Download free trial.
+ Reply to Thread
Results 31 to 60 of 664
Thread
-
-
Got it to work with your http://0.tcp.ap.ngrok.io:12365 api but not with http://127.0.0.1:18888
(have note tested if the keys was alright yet)
Edit: some sites just gives me "undefined" -
First of all thanks for the great work , loaded the server with the extension and this works like a charm !
Just one last thing , for the pssh and the lic url do i have to select them manually every time or am i doing something wrong ?
Regards -
-
-
Code:
let psshs = chrome.extension.getBackgroundPage().getPsshs(); let requests = chrome.extension.getBackgroundPage().getRequests(); let userInputs = {}; function drawList(arr, _searchBox, _list, _userInputs) { const elements = arr; const searchBox = document.getElementById(_searchBox); const list = document.getElementById(_list); elements.forEach((element, index) => { const li = document.createElement("li"); li.textContent = element; li.addEventListener("click", () => { userInputs[_userInputs] = index; document.getElementById(_userInputs).value = element; document.getElementById(_userInputs + "Index").value = index; document.getElementById("selectPssh").style.display = "none"; document.getElementById("selectRequest").style.display = "none"; document.getElementById("home").style.display = "block"; }); list.appendChild(li); }); searchBox.addEventListener("input", (event) => { const searchValue = event.target.value.toLowerCase(); list.innerHTML = ""; elements.forEach((element, index) => { if (element.toLowerCase().includes(searchValue)) { const li = document.createElement("li"); li.textContent = element; li.addEventListener("click", () => { userInputs[_userInputs] = index; document.getElementById(_userInputs).value = element; document.getElementById(_userInputs + "Index").value = index; document.getElementById("selectPssh").style.display = "none"; document.getElementById("selectRequest").style.display = "none"; document.getElementById("home").style.display = "block"; }); list.appendChild(li); } }); }); } function selectPssh() { document.getElementById("home").style.display = "none"; document.getElementById("selectPssh").style.display = "block"; } function selectRequest() { document.getElementById("home").style.display = "none"; document.getElementById("selectRequest").style.display = "block"; } var CommonWV = async function (pssh, licUrl, _headers) { const serverAddr = "http://127.0.0.1:18888"; console.group("fetch cert..."); let certBuffer = await fetch(licUrl, { body: new Uint8Array([0x08, 0x04]), headers: _headers, method: "POST", }).then((resp) => resp.arrayBuffer()); let certB64 = ""; if (isValidJson(String.fromCharCode(...new Uint8Array(certBuffer)))) { let jsonData = JSON.parse( String.fromCharCode(...new Uint8Array(certBuffer)) ); if (jsonData.license) { certB64 = jsonData.license; } else { console.log("JSON does not contain 'license'"); } } else { certB64 = btoa(String.fromCharCode(...new Uint8Array(certBuffer))); } console.log(certB64); console.groupEnd(); console.group("fetch challenge..."); let jsonC = await fetch(serverAddr + "/getchallenge", { body: JSON.stringify({ PSSH: pssh, CertBase64: certB64, }), headers: { "Content-Type": "application/json", }, method: "POST", }).then((resp) => resp.json()); let challengeBase64 = jsonC.challengeBase64; console.log(challengeBase64); console.groupEnd(); console.group("fetch license..."); let licBuffer = await fetch(licUrl, { body: Uint8Array.from(atob(challengeBase64), (c) => c.charCodeAt(0)), headers: _headers, method: "POST", }).then((resp) => resp.arrayBuffer()); let licB64 = ""; if (isValidJson(String.fromCharCode(...new Uint8Array(licBuffer)))) { let jsonData = JSON.parse( String.fromCharCode(...new Uint8Array(licBuffer)) ); if (jsonData.license) { licB64 = jsonData.license; } else { console.log("JSON does not contain 'license'"); } } else { licB64 = btoa(String.fromCharCode(...new Uint8Array(licBuffer))); } console.log(licB64); console.groupEnd(); console.group("get keys..."); let jsonK = await fetch(serverAddr + "/getkeys", { body: JSON.stringify({ PSSH: pssh, ChallengeBase64: challengeBase64, LicenseBase64: licB64, }), headers: { "Content-Type": "application/json", }, method: "POST", }).then((resp) => resp.json()); let keys = jsonK.keys; console.log(keys); console.groupEnd(); return keys; }; function isValidJson(str) { try { JSON.parse(str); return true; } catch (e) { return false; } } async function guess() { endpoint = document.getElementById("guessr").value; const result = await CommonWV( psshs[userInputs["pssh"]], requests[userInputs["license"]]["url"], requests[userInputs["license"]]["headers"] ); document.getElementById("result").value = result; } if (psshs.length != 0) { document.addEventListener("DOMContentLoaded", function () { document.getElementById("noEME").style.display = "none"; document.getElementById("home").style.display = "block"; document.getElementById("psshButton").addEventListener("click", selectPssh); document .getElementById("licenseButton") .addEventListener("click", selectRequest); document.getElementById("guess").addEventListener("click", guess); drawList(psshs, "psshSearch", "psshList", "pssh"); drawList( requests.map((r) => r["url"]), "requestSearch", "requestList", "license" ); }); }
-
-
@Karoolus, can you get it to pull keys that has M3u8 links as well instead of just MPD? thanks
-
multiple services has m3u8 with keys, I was just wandering is all. I like the app so far.
-
Ngrok public API shutdowned.
Instead, I published permanent public API, use this instead.
https://proposed-marketa-foxrefire.koyeb.app -
[Announcement]
Released new version.please update extension
New version includes:
* Custom scheme support
* Separate some codes to make code looks clear
* Public API integration
* Auto selects PSSH when there is one detected PSSH -
can you send me the URL again, as I looked on both links I had, but it says nothing been updated today. thanks
-
@FoxRefire can you add to pull keys from m3u8 links that have keys as well? thanks
-
The tool works great!
Truly one of the most special things I've seen lately.
Very smart development.
I would recommend adding the following actions to :RESULT
Direct link to the MPD file
+
auto Code ready for download using N_m3u8dl-re or webdl.\
+
Option to export the (cURL Header). -
This would be easier to use without the external WVCore server. Compile pywidevine to WASM using pyodide and it could all run in the extension...
-
@FoxRefire
first thanks for your rel
anyway with latest version, i can run WVCore.Server.exe and win cmd open and close instantly
before guesser does not work still for me, but WVCore.Server.exe cmd popup show some data correctly ...
Similar Threads
-
Is this Widevine or?
By cenkoman in forum Video Streaming DownloadingReplies: 6Last Post: 28th Dec 2022, 16:15 -
Widevine help
By Stevo1987 in forum Video Streaming DownloadingReplies: 16Last Post: 27th Aug 2022, 13:08 -
OSX Mac - Chrome v83 + Widevine L3 extension
By R4p1dH0n3Y in forum Video Streaming DownloadingReplies: 5Last Post: 17th Nov 2021, 15:53 -
Widevine guesser not working
By Hammer in forum Video Streaming DownloadingReplies: 13Last Post: 4th Oct 2021, 12:26 -
widevine decrypt extension for microsoft edge not working
By takheang303 in forum Video Streaming DownloadingReplies: 6Last Post: 3rd Apr 2021, 12:46