2024-04-18 20:48:32 +00:00
|
|
|
from pywidevine.cdm import Cdm
|
2024-05-30 20:45:19 +00:00
|
|
|
from pywidevine.remotecdm import RemoteCdm
|
2024-04-22 12:05:09 +00:00
|
|
|
from pywidevine.device import Device, DeviceTypes
|
2024-04-18 20:48:32 +00:00
|
|
|
from pywidevine.pssh import PSSH
|
|
|
|
|
|
|
|
import json
|
2024-05-01 21:37:00 +00:00
|
|
|
import js
|
|
|
|
import base64
|
2024-04-18 20:48:32 +00:00
|
|
|
from pyodide.http import pyfetch
|
|
|
|
|
2024-05-30 20:22:22 +00:00
|
|
|
def blobsToDevice(cID, pKey):
|
|
|
|
return Device(client_id=cID, private_key=pKey, type_=DeviceTypes['ANDROID'], security_level=3, flags=None)
|
|
|
|
|
|
|
|
async def loadCdm():
|
|
|
|
# Looking for device.wvd
|
|
|
|
try:
|
|
|
|
wvd = await (await pyfetch("device.wvd")).bytes()
|
|
|
|
return Cdm.from_device(Device.loads(wvd))
|
|
|
|
except:
|
|
|
|
pass
|
2024-04-18 20:48:32 +00:00
|
|
|
|
2024-05-30 20:22:22 +00:00
|
|
|
# Looking for device_client_id_blob + device_private_key
|
2024-04-22 12:05:09 +00:00
|
|
|
try:
|
|
|
|
cID=await (await pyfetch("device_client_id_blob")).bytes()
|
|
|
|
pKey=await (await pyfetch("device_private_key")).bytes()
|
2024-05-30 20:22:22 +00:00
|
|
|
return Cdm.from_device(blobsToDevice(cID, pKey))
|
|
|
|
except:
|
|
|
|
pass
|
2024-04-30 18:23:08 +00:00
|
|
|
|
2024-05-30 20:22:22 +00:00
|
|
|
# Looking for client_id.bin + private_key.pem
|
|
|
|
try:
|
|
|
|
cID=await (await pyfetch("client_id.bin")).bytes()
|
|
|
|
pKey=await (await pyfetch("private_key.pem")).bytes()
|
|
|
|
return Cdm.from_device(blobsToDevice(cID, pKey))
|
2024-05-30 20:45:19 +00:00
|
|
|
except:
|
|
|
|
pass
|
|
|
|
|
|
|
|
# Looking for remote.json
|
|
|
|
try:
|
|
|
|
remote_conf=await (await pyfetch("remote.json")).json()
|
|
|
|
return RemoteCdm(**remote_conf)
|
2024-05-30 20:22:22 +00:00
|
|
|
except Exception as e:
|
|
|
|
js.document.getElementById('result').value="n0suchd3v1c3f113:r3adth3fuck1ngma2ua1\n\n[MPD?]\nhttps://github.com/FoxRefire/wvg?tab=readme-ov-file#instalation"
|
|
|
|
raise Exception(e)
|
2024-04-30 18:23:08 +00:00
|
|
|
|
2024-06-06 03:38:08 +00:00
|
|
|
# Define corsFetch API for requesting server that require origin header
|
|
|
|
async def corsFetch(url: str, method: str, headers: [dict, str], body: [dict, bytes, str], resType: str="blob"):
|
|
|
|
if type(headers) == dict:
|
|
|
|
headers = json.dumps(headers)
|
|
|
|
|
|
|
|
match body:
|
|
|
|
case bytes(): body = base64.b64encode(body).decode()
|
|
|
|
case str(): body = base64.b64encode(body.encode()).decode()
|
|
|
|
case dict(): body = base64.b64encode(json.dumps(body).encode()).decode()
|
|
|
|
|
|
|
|
res = await js.corsFetch(url, method, headers, body)
|
|
|
|
res = base64.b64decode(res.encode())
|
|
|
|
|
|
|
|
match resType:
|
|
|
|
case "blob": pass
|
|
|
|
case "str": res = res.decode()
|
|
|
|
case "json": res = json.loads(res.decode())
|
|
|
|
|
|
|
|
return res
|
2024-04-22 12:05:09 +00:00
|
|
|
|
2024-05-30 20:22:22 +00:00
|
|
|
# prepare pssh
|
|
|
|
pssh = PSSH(pssh)
|
2024-04-18 20:48:32 +00:00
|
|
|
|
|
|
|
# load cdm
|
2024-05-30 20:22:22 +00:00
|
|
|
cdm = await loadCdm()
|
2024-04-18 20:48:32 +00:00
|
|
|
|
|
|
|
# open cdm session
|
|
|
|
session_id = cdm.open()
|
|
|
|
|
|
|
|
# get license challenge
|
|
|
|
challenge = cdm.get_license_challenge(session_id, pssh)
|
|
|
|
|
|
|
|
licHeaders=json.loads(licHeaders)
|
2024-05-17 19:56:28 +00:00
|
|
|
|
|
|
|
js.chrome.extension.getBackgroundPage().isBlock=False
|