Added proxy support

- Added automatic proxy support via proxyscrape API
This commit is contained in:
CDM-Project 2024-09-17 14:09:20 -04:00
parent 84ae841f99
commit 9e99bec0f1
2 changed files with 55 additions and 6 deletions

View File

@ -1,5 +1,7 @@
import base64 import base64
from random import random
import requests
import httpx import httpx
from pywidevine.cdm import Cdm from pywidevine.cdm import Cdm
from pywidevine.device import Device from pywidevine.device import Device
@ -7,6 +9,7 @@ from pywidevine.pssh import PSSH
from pywidevine.remotecdm import RemoteCdm from pywidevine.remotecdm import RemoteCdm
import yaml import yaml
import os import os
import random
from colorama import Fore from colorama import Fore
import re import re
from . import CDM_Selector from . import CDM_Selector
@ -76,6 +79,28 @@ def find_widevine_license(dictionary):
elif isinstance(value, dict): elif isinstance(value, dict):
find_widevine_license(value) 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(): def decrypt_local_cdm():
cdm_choice = CDM_Selector.select_local_cdm() cdm_choice = CDM_Selector.select_local_cdm()
try: try:
@ -119,6 +144,13 @@ def decrypt_local_cdm():
exit(1) exit(1)
user_license_url = input("License URL: ") user_license_url = input("License URL: ")
db_url = user_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() print()
license_curl = load_license_curl() license_curl = load_license_curl()
db_headers = license_curl.headers db_headers = license_curl.headers
@ -129,7 +161,8 @@ def decrypt_local_cdm():
url=user_license_url, url=user_license_url,
headers=license_curl.headers, headers=license_curl.headers,
cookies=license_curl.cookies, cookies=license_curl.cookies,
data=cdm.service_certificate_challenge data=cdm.service_certificate_challenge,
proxies=Proxy
) )
try: try:
cdm.set_service_certificate(session_id=session_id, certificate=service_certificate.content) cdm.set_service_certificate(session_id=session_id, certificate=service_certificate.content)
@ -148,6 +181,7 @@ def decrypt_local_cdm():
try: try:
replace_widevine_challenge(license_curl.data, base64.b64encode(challenge).decode()) replace_widevine_challenge(license_curl.data, base64.b64encode(challenge).decode())
lic_data = license_curl.data lic_data = license_curl.data
db_data = license_curl.data
except: except:
pass pass
else: else:
@ -156,6 +190,7 @@ def decrypt_local_cdm():
try: try:
replace_widevine_challenge(license_curl.json_data, base64.b64encode(challenge).decode()) replace_widevine_challenge(license_curl.json_data, base64.b64encode(challenge).decode())
json_data = license_curl.json_data json_data = license_curl.json_data
db_data = license_curl.json_data
except: except:
pass pass
else: else:
@ -166,7 +201,8 @@ def decrypt_local_cdm():
headers=license_curl.headers, headers=license_curl.headers,
cookies=license_curl.cookies, cookies=license_curl.cookies,
json=json_data, 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: except Exception as error:
print(f'{Fore.RED}An error occurred.\n\n{error}') print(f'{Fore.RED}An error occurred.\n\n{error}')
@ -233,6 +269,13 @@ def decrypt_remote_cdm():
exit(1) exit(1)
user_license_url = input("License URL: ") user_license_url = input("License URL: ")
db_url = user_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() print()
license_curl = load_license_curl() license_curl = load_license_curl()
db_headers = license_curl.headers db_headers = license_curl.headers
@ -243,7 +286,8 @@ def decrypt_remote_cdm():
url=user_license_url, url=user_license_url,
headers=license_curl.headers, headers=license_curl.headers,
cookies=license_curl.cookies, cookies=license_curl.cookies,
data=cdm.service_certificate_challenge data=cdm.service_certificate_challenge,
proxies=Proxy
) )
try: try:
cdm.set_service_certificate(session_id=session_id, certificate=service_certificate.content) cdm.set_service_certificate(session_id=session_id, certificate=service_certificate.content)
@ -257,11 +301,11 @@ def decrypt_remote_cdm():
except Exception as error: except Exception as error:
print(f'{Fore.RED}An error occurred.\n\n{error}\n\nTrying without service certificate') 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) challenge = cdm.get_license_challenge(session_id=session_id, pssh=pssh, privacy_mode=set_service_certificate_success)
db_data = challenge
if license_curl.data: if license_curl.data:
try: try:
replace_widevine_challenge(license_curl.data, base64.b64encode(challenge).decode()) replace_widevine_challenge(license_curl.data, base64.b64encode(challenge).decode())
lic_data = license_curl.data lic_data = license_curl.data
db_data = license_curl.data
except: except:
pass pass
else: else:
@ -270,17 +314,21 @@ def decrypt_remote_cdm():
try: try:
replace_widevine_challenge(license_curl.json_data, base64.b64encode(challenge).decode()) replace_widevine_challenge(license_curl.json_data, base64.b64encode(challenge).decode())
json_data = license_curl.json_data json_data = license_curl.json_data
db_data = license_curl.json_data
except: except:
pass pass
else: else:
json_data = None json_data = None
if json_data is None and lic_data is None:
db_data = challenge
try: try:
license_response = httpx.post( license_response = httpx.post(
url=user_license_url, url=user_license_url,
headers=license_curl.headers, headers=license_curl.headers,
cookies=license_curl.cookies, cookies=license_curl.cookies,
json=json_data, 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: except Exception as error:
print(f'{Fore.RED}An error occurred.\n\n{error}') print(f'{Fore.RED}An error occurred.\n\n{error}')

View File

@ -27,7 +27,8 @@ def check_if_config_exists():
else: else:
initial_config_data = { initial_config_data = {
'First_Run': 'True', '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]: ') 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: if create_input: