Files
CDRM-Extension-API/decrypt.py
TPD94 909c95ed7a Added proxy support
- Minor code change to prevent bug
2024-04-27 18:05:35 -04:00

89 lines
2.3 KiB
Python

# import dependencies
import os
from pywidevine import PSSH
from pywidevine import Cdm
from pywidevine import Device
import requests
import glob
from cache_keys import cache_keys
# Get the current working directory
main_directory = os.getcwd()
# Making sure a .wvd file exists and using that as the extracted device
try:
extracted_device = glob.glob(f'{main_directory}/*.wvd')[0]
except:
extracted_cdm = None
print(f"Please place a WVD in {main_directory}/")
# Defining decrypt function
def decrypt_content(in_pssh: str = None, license_url: str = None, headers: dict = None, mpd: str = None, proxy: str = None) -> list:
# prepare pssh
pssh = PSSH(in_pssh)
# load device
device = Device.load(extracted_device)
# load CDM from device
cdm = Cdm.from_device(device)
# open CDM session
session_id = cdm.open()
# Generate the challenge
challenge = cdm.get_license_challenge(session_id, pssh)
if proxy is not None:
# send license challenge
license = requests.post(
url=license_url,
headers=headers,
data=challenge,
proxies={'http': proxy}
)
else:
# send license challenge
license = requests.post(
url=license_url,
headers=headers,
data=challenge
)
# Parse the license if it comes back in plain bytes
try:
cdm.parse_license(session_id, license.content)
except:
# Exception, try to find by regex via json
try:
cdm.parse_license(session_id, license.json()['license'])
except:
try:
cdm.parse_license(session_id, license.json()['licenseData'])
except Exception as error:
return [error]
# Assign variable for caching keys
cached_keys = ""
# assign variable for returned keys
returned_keys = []
for key in cdm.get_keys(session_id):
if key.type != "SIGNING":
returned_keys.append(f"--key {key.kid.hex}:{key.key.hex()}")
cached_keys += f"{key.kid.hex}:{key.key.hex()}\n"
# Cache the keys
cache_keys(pssh=in_pssh, keys=cached_keys, mpd=mpd)
# close session, disposes of session data
cdm.close(session_id)
# Return the keys
return returned_keys