From 9e99bec0f1537924dedee60f50b3cf66b73f3e34 Mon Sep 17 00:00:00 2001 From: CDM-Project Date: Tue, 17 Sep 2024 14:09:20 -0400 Subject: [PATCH] Added proxy support - Added automatic proxy support via proxyscrape API --- CDRM_Modules/Decrypt.py | 58 +++++++++++++++++++++++++++++++--- CDRM_Modules/Startup_Checks.py | 3 +- 2 files changed, 55 insertions(+), 6 deletions(-) diff --git a/CDRM_Modules/Decrypt.py b/CDRM_Modules/Decrypt.py index 3002dd4..76166c6 100644 --- a/CDRM_Modules/Decrypt.py +++ b/CDRM_Modules/Decrypt.py @@ -1,5 +1,7 @@ import base64 +from random import random +import requests import httpx from pywidevine.cdm import Cdm from pywidevine.device import Device @@ -7,6 +9,7 @@ from pywidevine.pssh import PSSH from pywidevine.remotecdm import RemoteCdm import yaml import os +import random from colorama import Fore import re from . import CDM_Selector @@ -76,6 +79,28 @@ def find_widevine_license(dictionary): elif isinstance(value, dict): find_widevine_license(value) +def get_proxy(country_code): + params = { + 'request': 'displayproxies', + 'protocol': 'http', + 'timeout': '10000', + 'country': f'{country_code}', + 'ssl': 'all', + 'anonymity': 'all', + } + + response = requests.get('https://api.proxyscrape.com/v2/', params=params) + + lines = response.text.splitlines() + random_line = random.choice(lines) + + proxies = { + 'http://': f'http://{random_line}', + 'https://': f'http://{random_line}' + } + + return proxies + def decrypt_local_cdm(): cdm_choice = CDM_Selector.select_local_cdm() try: @@ -119,6 +144,13 @@ def decrypt_local_cdm(): exit(1) user_license_url = input("License URL: ") db_url = user_license_url + Proxy = None + with open('Config.yaml', 'r') as ymlfile: + config = yaml.safe_load(ymlfile) + if 'Proxy' in config: + if len(config['Proxy']) == 2: + Proxy = get_proxy(config['Proxy']) + print(f'Using Proxy {Proxy}') print() license_curl = load_license_curl() db_headers = license_curl.headers @@ -129,7 +161,8 @@ def decrypt_local_cdm(): url=user_license_url, headers=license_curl.headers, cookies=license_curl.cookies, - data=cdm.service_certificate_challenge + data=cdm.service_certificate_challenge, + proxies=Proxy ) try: cdm.set_service_certificate(session_id=session_id, certificate=service_certificate.content) @@ -148,6 +181,7 @@ def decrypt_local_cdm(): try: replace_widevine_challenge(license_curl.data, base64.b64encode(challenge).decode()) lic_data = license_curl.data + db_data = license_curl.data except: pass else: @@ -156,6 +190,7 @@ def decrypt_local_cdm(): try: replace_widevine_challenge(license_curl.json_data, base64.b64encode(challenge).decode()) json_data = license_curl.json_data + db_data = license_curl.json_data except: pass else: @@ -166,7 +201,8 @@ def decrypt_local_cdm(): headers=license_curl.headers, cookies=license_curl.cookies, json=json_data, - data=challenge if json_data is None and lic_data is None else lic_data + data=challenge if json_data is None and lic_data is None else lic_data, + proxies=Proxy ) except Exception as error: print(f'{Fore.RED}An error occurred.\n\n{error}') @@ -233,6 +269,13 @@ def decrypt_remote_cdm(): exit(1) user_license_url = input("License URL: ") db_url = user_license_url + Proxy = None + with open('Config.yaml', 'r') as ymlfile: + config = yaml.safe_load(ymlfile) + if 'Proxy' in config: + if len(config['Proxy']) == 2: + Proxy = get_proxy(config['Proxy']) + print(f'Using Proxy {Proxy}') print() license_curl = load_license_curl() db_headers = license_curl.headers @@ -243,7 +286,8 @@ def decrypt_remote_cdm(): url=user_license_url, headers=license_curl.headers, cookies=license_curl.cookies, - data=cdm.service_certificate_challenge + data=cdm.service_certificate_challenge, + proxies=Proxy ) try: cdm.set_service_certificate(session_id=session_id, certificate=service_certificate.content) @@ -257,11 +301,11 @@ def decrypt_remote_cdm(): 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, privacy_mode=set_service_certificate_success) - db_data = challenge if license_curl.data: try: replace_widevine_challenge(license_curl.data, base64.b64encode(challenge).decode()) lic_data = license_curl.data + db_data = license_curl.data except: pass else: @@ -270,17 +314,21 @@ def decrypt_remote_cdm(): try: replace_widevine_challenge(license_curl.json_data, base64.b64encode(challenge).decode()) json_data = license_curl.json_data + db_data = license_curl.json_data except: pass else: json_data = None + if json_data is None and lic_data is None: + db_data = challenge try: license_response = httpx.post( url=user_license_url, headers=license_curl.headers, cookies=license_curl.cookies, json=json_data, - data=challenge if json_data is None and lic_data is None else lic_data + data=challenge if json_data is None and lic_data is None else lic_data, + proxies=Proxy ) except Exception as error: print(f'{Fore.RED}An error occurred.\n\n{error}') diff --git a/CDRM_Modules/Startup_Checks.py b/CDRM_Modules/Startup_Checks.py index d7f8fed..5855b06 100644 --- a/CDRM_Modules/Startup_Checks.py +++ b/CDRM_Modules/Startup_Checks.py @@ -27,7 +27,8 @@ def check_if_config_exists(): else: initial_config_data = { 'First_Run': 'True', - 'Remote_CDM_API_FQDN': 'http://127.0.0.1:5000' + 'Remote_CDM_API_FQDN': 'http://127.0.0.1:5000', + 'Proxy': 'US' } create_input = input(f'\n{Fore.YELLOW}Config.yaml not found, would you like to create a Config.yaml? [(Y)es/(N)o]: ') if create_input: