import httpx from pywidevine.cdm import Cdm from pywidevine.device import Device from pywidevine.pssh import PSSH from pywidevine.remotecdm import RemoteCdm import yaml import os from colorama import Fore from . import CDM_Selector def load_license_curl(): class LicenseCURL: def __init__(self): self.headers = headers self.cookies = cookies try: with open(f'{os.getcwd()}/License_cURL.py', 'r') as file: local_namespace = {} exec(file.read(), globals(), local_namespace) except Exception as error: print(f'{Fore.RED}An error occurred.\n\n{error}') if 'headers' in local_namespace: headers = local_namespace['headers'] else: headers = None if 'cookies' in local_namespace: cookies = local_namespace['cookies'] else: cookies = None return LicenseCURL() def decrypt_local_cdm(): cdm_choice = CDM_Selector.select_local_cdm() try: device = Device.load(f'{os.getcwd()}/WVDs/{cdm_choice}') except Exception as error: print(f'{Fore.RED}An error occurred.\n\n{error}') exit(1) try: cdm = Cdm.from_device(device) except Exception as error: print(f'{Fore.RED}An error occurred.\n\n{error}') exit(1) try: session_id = cdm.open() except Exception as error: print(f'{Fore.RED}An error occurred.\n\n{error}') exit(1) try: pssh = PSSH(input("\nPSSH: ")) except Exception as error: print(f'{Fore.RED}An error occurred.\n\n{error}') exit(1) user_license_url = input("License URL: ") print() license_curl = load_license_curl() try: service_certificate = httpx.post( url=user_license_url, headers=license_curl.headers, cookies=license_curl.cookies, data=cdm.service_certificate_challenge ).content cdm.set_service_certificate(session_id=session_id, certificate=service_certificate) except Exception as error: print(f'{Fore.RED}An error occurred.\n\n{error}\n\nTrying without service certificate') challenge = cdm.get_license_challenge(session_id=session_id, pssh=pssh) try: license_response = httpx.post( url=user_license_url, headers=license_curl.headers, cookies=license_curl.cookies, data=challenge ).content except Exception as error: print(f'{Fore.RED}An error occurred.\n\n{error}') exit(1) try: cdm.parse_license(session_id=session_id, license_message=license_response) except Exception as error: print(f'{Fore.RED}An error occurred.\n\n{error}') exit(1) for key in cdm.get_keys(session_id): if key.type == 'CONTENT': print(f"{key.kid.hex}:{key.key.hex()}") return def decrypt_remote_cdm(): remote_cdm_choice = CDM_Selector.select_remote_cdm() try: with open(f'{os.getcwd()}/Config.yaml', 'r') as ymlfile: config = yaml.safe_load(ymlfile) cdm = RemoteCdm( device_type=config['Remote_CDMs'][remote_cdm_choice]['device_type'], system_id=config['Remote_CDMs'][remote_cdm_choice]['system_id'], security_level=config['Remote_CDMs'][remote_cdm_choice]['security_level'], host=config['Remote_CDMs'][remote_cdm_choice]['host'], secret=config['Remote_CDMs'][remote_cdm_choice]['secret'], device_name=config['Remote_CDMs'][remote_cdm_choice]['name'], ) except Exception as error: print(f'{Fore.RED}An error occurred.\n\n{error}') exit(1) try: session_id = cdm.open() except Exception as error: print(f'{Fore.RED}An error occurred.\n\n{error}') exit(1) try: pssh = PSSH(input("\nPSSH: ")) except Exception as error: print(f'{Fore.RED}An error occurred.\n\n{error}') exit(1) user_license_url = input("License URL: ") print() license_curl = load_license_curl() try: service_certificate = httpx.post( url=user_license_url, headers=license_curl.headers, cookies=license_curl.cookies, data=cdm.service_certificate_challenge ).content cdm.set_service_certificate(session_id=session_id, certificate=service_certificate) except Exception as error: print(f'{Fore.RED}An error occurred.\n\n{error}\n\nTrying without service certificate') challenge = cdm.get_license_challenge(session_id=session_id, pssh=pssh) try: license_response = httpx.post( url=user_license_url, headers=license_curl.headers, cookies=license_curl.cookies, data=challenge ).content except Exception as error: print(f'{Fore.RED}An error occurred.\n\n{error}') exit(1) try: cdm.parse_license(session_id=session_id, license_message=license_response) except Exception as error: print(f'{Fore.RED}An error occurred.\n\n{error}') exit(1) for key in cdm.get_keys(session_id): if key.type == 'CONTENT': print(f"{key.kid.hex}:{key.key.hex()}") return