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
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}')

View File

@ -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: