wvg/python/pre.py
FoxRefire 64b86a1711 Refactor: Define loadBody API for make scheme file more concise
The loadBody() function allows more concise and intuitive loading of request bodies encoded in the scheme.
2024-06-07 04:03:37 +09:00

93 lines
2.8 KiB
Python

from pywidevine.cdm import Cdm
from pywidevine.remotecdm import RemoteCdm
from pywidevine.device import Device, DeviceTypes
from pywidevine.pssh import PSSH
import json
import js
import base64
from pyodide.http import pyfetch
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
# Looking for device_client_id_blob + device_private_key
try:
cID=await (await pyfetch("device_client_id_blob")).bytes()
pKey=await (await pyfetch("device_private_key")).bytes()
return Cdm.from_device(blobsToDevice(cID, pKey))
except:
pass
# 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))
except:
pass
# Looking for remote.json
try:
remote_conf=await (await pyfetch("remote.json")).json()
return RemoteCdm(**remote_conf)
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)
# 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
# Define loadBody API for loading requestBody to scheme concisely
def loadBody(loadAs: str):
global licBody
licBody = base64.b64decode(licBody.encode())
match loadAs:
case "blob": pass
case "str": licBody = licBody.decode()
case "json": licBody = json.loads(licBody.decode())
return licBody
# prepare pssh
pssh = PSSH(pssh)
# load cdm
cdm = await loadCdm()
# open cdm session
session_id = cdm.open()
# get license challenge
challenge = cdm.get_license_challenge(session_id, pssh)
licHeaders=json.loads(licHeaders)
js.chrome.extension.getBackgroundPage().isBlock=False