Netflix changes, add delay for subs
This commit is contained in:
parent
fca2266d33
commit
46fb3e7adf
@ -505,6 +505,8 @@ def result(ctx, service, quality, closest_resolution, range_, wanted, alang, sla
|
|||||||
|
|
||||||
if service:
|
if service:
|
||||||
save_cookies(service_name, service, ctx.obj.profile)
|
save_cookies(service_name, service, ctx.obj.profile)
|
||||||
|
if isinstance(track, TextTrack):
|
||||||
|
time.sleep(5) # Sleep 5 seconds before downloading each subtitle track to avoid 403 errors
|
||||||
track.download(directories.temp, headers=service.session.headers, proxy=proxy)
|
track.download(directories.temp, headers=service.session.headers, proxy=proxy)
|
||||||
log.info(" + Downloaded")
|
log.info(" + Downloaded")
|
||||||
if isinstance(track, VideoTrack) and track.needs_ccextractor_first and not no_subs:
|
if isinstance(track, VideoTrack) and track.needs_ccextractor_first and not no_subs:
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
Binary file not shown.
@ -18,7 +18,6 @@ from vinetrimmer.utils.MSL import MSL
|
|||||||
from vinetrimmer.utils.MSL.schemes import KeyExchangeSchemes, EntityAuthenticationSchemes
|
from vinetrimmer.utils.MSL.schemes import KeyExchangeSchemes, EntityAuthenticationSchemes
|
||||||
from vinetrimmer.utils.MSL.schemes.UserAuthentication import UserAuthentication
|
from vinetrimmer.utils.MSL.schemes.UserAuthentication import UserAuthentication
|
||||||
from vinetrimmer.utils.gen_esn import chrome_esn_generator, android_esn_generator, playready_esn_generator
|
from vinetrimmer.utils.gen_esn import chrome_esn_generator, android_esn_generator, playready_esn_generator
|
||||||
from vinetrimmer.utils.widevine.device import LocalDevice, RemoteDevice
|
|
||||||
from vinetrimmer.vendor.pymp4.parser import Box
|
from vinetrimmer.vendor.pymp4.parser import Box
|
||||||
from vinetrimmer.utils.gen_esn import chrome_esn_generator
|
from vinetrimmer.utils.gen_esn import chrome_esn_generator
|
||||||
|
|
||||||
@ -185,7 +184,7 @@ class Netflix(BaseService):
|
|||||||
is_android_l3 = False
|
is_android_l3 = False
|
||||||
try:
|
try:
|
||||||
if hasattr(self.cdm, 'device') and hasattr(self.cdm.device, 'security_level') and hasattr(self.cdm.device, 'type'):
|
if hasattr(self.cdm, 'device') and hasattr(self.cdm.device, 'security_level') and hasattr(self.cdm.device, 'type'):
|
||||||
is_android_l3 = (self.cdm.device.security_level == 3 and self.cdm.device.type == LocalDevice.Types.ANDROID)
|
is_android_l3 = (self.cdm.device.security_level == 3 and self.cdm.device.type == DeviceTypes.ANDROID)
|
||||||
except AttributeError:
|
except AttributeError:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|||||||
@ -26,7 +26,6 @@ from vinetrimmer.utils.MSL.schemes import KeyExchangeSchemes
|
|||||||
from vinetrimmer.utils.MSL.schemes.EntityAuthentication import EntityAuthentication
|
from vinetrimmer.utils.MSL.schemes.EntityAuthentication import EntityAuthentication
|
||||||
from vinetrimmer.utils.MSL.schemes.PlayReadyKeyExchangeScheme import PlayReady as PlayReadyScheme
|
from vinetrimmer.utils.MSL.schemes.PlayReadyKeyExchangeScheme import PlayReady as PlayReadyScheme
|
||||||
from vinetrimmer.utils.MSL.schemes.KeyExchangeRequest import KeyExchangeRequest
|
from vinetrimmer.utils.MSL.schemes.KeyExchangeRequest import KeyExchangeRequest
|
||||||
from vinetrimmer.utils.widevine.device import RemoteDevice
|
|
||||||
from vinetrimmer.utils.gen_esn import chrome_esn_generator, android_esn_generator, playready_esn_generator
|
from vinetrimmer.utils.gen_esn import chrome_esn_generator, android_esn_generator, playready_esn_generator
|
||||||
from requests.adapters import HTTPAdapter
|
from requests.adapters import HTTPAdapter
|
||||||
from requests.packages.urllib3.poolmanager import PoolManager
|
from requests.packages.urllib3.poolmanager import PoolManager
|
||||||
@ -194,6 +193,7 @@ class MSL:
|
|||||||
|
|
||||||
key_data = key_response_data["keydata"]
|
key_data = key_response_data["keydata"]
|
||||||
if scheme == KeyExchangeSchemes.Widevine:
|
if scheme == KeyExchangeSchemes.Widevine:
|
||||||
|
from vinetrimmer.utils.widevine.device import RemoteDevice
|
||||||
if isinstance(cdm.device, RemoteDevice):
|
if isinstance(cdm.device, RemoteDevice):
|
||||||
msl_keys.encryption, msl_keys.sign = cdm.device.exchange(
|
msl_keys.encryption, msl_keys.sign = cdm.device.exchange(
|
||||||
cdm.sessions[msl_keys.cdm_session],
|
cdm.sessions[msl_keys.cdm_session],
|
||||||
|
|||||||
@ -52,4 +52,94 @@ def edge_esn_generator():
|
|||||||
with open(esn_file, 'r') as f:
|
with open(esn_file, 'r') as f:
|
||||||
esn = f.read()
|
esn = f.read()
|
||||||
|
|
||||||
return esn
|
return esn
|
||||||
|
|
||||||
|
|
||||||
|
def playready_esn_generator():
|
||||||
|
# Lista di modelli di TV e dispositivi PlayReady
|
||||||
|
tv_models = [
|
||||||
|
"HE55A7000EUWTS", # Hisense
|
||||||
|
"KD55X85J", # Sony
|
||||||
|
"UN55TU7000", # Samsung
|
||||||
|
"OLED55C1", # LG
|
||||||
|
"55PUS7805", # Philips
|
||||||
|
"55R635", # TCL
|
||||||
|
"L55M5-Z2", # Xiaomi
|
||||||
|
]
|
||||||
|
|
||||||
|
# Lista di produttori
|
||||||
|
manufacturers = [
|
||||||
|
"HISENSE",
|
||||||
|
"SONY",
|
||||||
|
"SAMSUNG",
|
||||||
|
"LG",
|
||||||
|
"PHILIPS",
|
||||||
|
"TCL",
|
||||||
|
"XIAOMI"
|
||||||
|
]
|
||||||
|
|
||||||
|
# Scegli un produttore e un modello casualmente
|
||||||
|
manufacturer = random.choice(manufacturers)
|
||||||
|
model = random.choice(tv_models)
|
||||||
|
|
||||||
|
esn_file = '.esn_playready'
|
||||||
|
|
||||||
|
def gen_file():
|
||||||
|
# Crea un ESN nel formato NFANDROID1-PRN-[MANUFACTURER]-[MODEL]
|
||||||
|
esn = f"NFANDROID1-PRN-{manufacturer}-{model}"
|
||||||
|
with open(esn_file, 'w') as file:
|
||||||
|
file.write(esn)
|
||||||
|
|
||||||
|
if not os.path.isfile(esn_file):
|
||||||
|
log.warning("Generating a new PlayReady ESN")
|
||||||
|
gen_file()
|
||||||
|
|
||||||
|
file_datetime = datetime.fromtimestamp(os.path.getmtime(esn_file))
|
||||||
|
time_diff = datetime.now() - file_datetime
|
||||||
|
if time_diff > timedelta(hours=6):
|
||||||
|
log.warning("Old ESN detected, Generating a new PlayReady ESN")
|
||||||
|
gen_file()
|
||||||
|
|
||||||
|
with open(esn_file, 'r') as f:
|
||||||
|
esn = f.read()
|
||||||
|
|
||||||
|
return esn
|
||||||
|
|
||||||
|
def android_esn_generator():
|
||||||
|
# Parametri per dispositivi Android
|
||||||
|
manufacturers = ["SAMSUNG", "ONEPLUS", "XIAOMI", "MOTOROLA", "GOOGLE", "NVIDIA"]
|
||||||
|
models = [
|
||||||
|
"SM-T865", "SM-G975F", "SM-N975F", # Samsung
|
||||||
|
"IN2020", "KB2000", "LE2100", # OnePlus
|
||||||
|
"M2007J3SG", "M2004J19C", "M2102J20SG", # Xiaomi
|
||||||
|
"Pixel 5", "Pixel 6 Pro", "Pixel 7", # Google
|
||||||
|
"SHIELD Android TV", "SHIELD Pro" # NVIDIA
|
||||||
|
]
|
||||||
|
|
||||||
|
# Genera una stringa casuale alfanumerica per l'ID del dispositivo
|
||||||
|
device_id = "".join(random.choice("0123456789ABCDEF") for _ in range(16))
|
||||||
|
|
||||||
|
esn_file = '.esn_android'
|
||||||
|
|
||||||
|
def gen_file():
|
||||||
|
manufacturer = random.choice(manufacturers)
|
||||||
|
model = random.choice(models)
|
||||||
|
# Formato ESN per Android: NFANDROID1-PRV-[build info]-[device ID]-[model]
|
||||||
|
esn = f"NFANDROID1-PRV-{manufacturer[:4]}{random.randint(1000,9999)}-{device_id}-{model}"
|
||||||
|
with open(esn_file, 'w') as file:
|
||||||
|
file.write(esn)
|
||||||
|
|
||||||
|
if not os.path.isfile(esn_file):
|
||||||
|
log.warning("Generating a new Android ESN")
|
||||||
|
gen_file()
|
||||||
|
|
||||||
|
file_datetime = datetime.fromtimestamp(os.path.getmtime(esn_file))
|
||||||
|
time_diff = datetime.now() - file_datetime
|
||||||
|
if time_diff > timedelta(hours=6):
|
||||||
|
log.warning("Old ESN detected, Generating a new Android ESN")
|
||||||
|
gen_file()
|
||||||
|
|
||||||
|
with open(esn_file, 'r') as f:
|
||||||
|
esn = f.read()
|
||||||
|
|
||||||
|
return esn
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user