163 lines
5.2 KiB
Python
163 lines
5.2 KiB
Python
|
import time, os, json, logging, base64
|
||
|
from helpers.Parsers.Netflix.MSLClient import MSLClient
|
||
|
from configs.config import tool
|
||
|
from pywidevine.decrypt.wvdecryptcustom import WvDecrypt
|
||
|
|
||
|
logger = logging.getLogger(__name__)
|
||
|
|
||
|
''' "av1-main-L20-dash-cbcs-prk",
|
||
|
"av1-main-L21-dash-cbcs-prk",
|
||
|
"av1-main-L30-dash-cbcs-prk",
|
||
|
"av1-main-L31-dash-cbcs-prk",
|
||
|
"av1-main-L40-dash-cbcs-prk",
|
||
|
"av1-main-L41-dash-cbcs-prk",
|
||
|
"av1-main-L50-dash-cbcs-prk",
|
||
|
"av1-main-L51-dash-cbcs-prk",'''
|
||
|
|
||
|
''' "vp9-profile0-L21-dash-cenc",
|
||
|
"vp9-profile0-L30-dash-cenc",
|
||
|
"vp9-profile0-L31-dash-cenc",
|
||
|
"vp9-profile0-L40-dash-cenc",
|
||
|
"vp9-profile2-L30-dash-cenc-prk",
|
||
|
"vp9-profile2-L31-dash-cenc-prk",
|
||
|
"vp9-profile2-L40-dash-cenc-prk",
|
||
|
"vp9-profile2-L50-dash-cenc-prk",
|
||
|
"vp9-profile2-L51-dash-cenc-prk"'''
|
||
|
|
||
|
def from_kid(kid):
|
||
|
array_of_bytes = bytearray(b"\x00\x00\x002pssh\x00\x00\x00\x00")
|
||
|
array_of_bytes.extend(bytes.fromhex("edef8ba979d64acea3c827dcd51d21ed"))
|
||
|
array_of_bytes.extend(b"\x00\x00\x00\x12\x12\x10")
|
||
|
array_of_bytes.extend(bytes.fromhex(kid.replace("-", "")))
|
||
|
pssh = base64.b64encode(bytes.fromhex(array_of_bytes.hex()))
|
||
|
return pssh.decode()
|
||
|
|
||
|
def __profiles(profile, addHEVCDO=False):
|
||
|
|
||
|
profiles = [
|
||
|
"heaac-2-dash",
|
||
|
"dfxp-ls-sdh",
|
||
|
"webvtt-lssdh-ios8",
|
||
|
"BIF240",
|
||
|
"BIF320",
|
||
|
]
|
||
|
|
||
|
if profile == "High KEYS":
|
||
|
profiles += [
|
||
|
"playready-h264hpl22-dash",
|
||
|
"playready-h264hpl30-dash",
|
||
|
"playready-h264hpl31-dash",
|
||
|
#'playready-h264hpl40-dash'
|
||
|
]
|
||
|
|
||
|
elif profile == "Main KEYS":
|
||
|
profiles += [
|
||
|
"playready-h264bpl30-dash",
|
||
|
"playready-h264mpl30-dash",
|
||
|
"playready-h264mpl31-dash",
|
||
|
"playready-h264mpl40-dash",
|
||
|
]
|
||
|
|
||
|
elif profile == "HEVC KEYS":
|
||
|
profiles += [
|
||
|
"hevc-main-L30-dash-cenc",
|
||
|
"hevc-main10-L30-dash-cenc",
|
||
|
"hevc-main10-L30-dash-cenc-prk",
|
||
|
"hevc-main-L31-dash-cenc"
|
||
|
"hevc-main10-L31-dash-cenc",
|
||
|
"hevc-main10-L31-dash-cenc-prk",
|
||
|
"hevc-main-L40-dash-cenc",
|
||
|
"hevc-main10-L40-dash-cenc",
|
||
|
"hevc-main10-L40-dash-cenc-prk",
|
||
|
"hevc-main-L41-dash-cenc",
|
||
|
"hevc-main10-L41-dash-cenc",
|
||
|
"hevc-main10-L41-dash-cenc-prk"
|
||
|
]
|
||
|
if addHEVCDO:
|
||
|
profiles += [
|
||
|
"hevc-main10-L31-dash-cenc-prk-do",
|
||
|
"hevc-main10-L31-dash-cenc-prk-do",
|
||
|
"hevc-main10-L40-dash-cenc-prk-do",
|
||
|
"hevc-main10-L41-dash-cenc-prk-do",
|
||
|
]
|
||
|
|
||
|
elif profile == 'HDR-10 KEYS':
|
||
|
profiles += [
|
||
|
"hevc-hdr-main10-L30-dash-cenc",
|
||
|
"hevc-hdr-main10-L30-dash-cenc-prk",
|
||
|
"hevc-hdr-main10-L31-dash-cenc",
|
||
|
"hevc-hdr-main10-L31-dash-cenc-prk",
|
||
|
"hevc-hdr-main10-L40-dash-cenc",
|
||
|
"hevc-hdr-main10-L41-dash-cenc",
|
||
|
"hevc-hdr-main10-L40-dash-cenc-prk",
|
||
|
"hevc-hdr-main10-L41-dash-cenc-prk"
|
||
|
]
|
||
|
else:
|
||
|
profiles += [
|
||
|
"playready-h264mpl30-dash",
|
||
|
]
|
||
|
|
||
|
return profiles
|
||
|
|
||
|
def GettingKEYS_Netflixv2(nfID, profile): #
|
||
|
|
||
|
KEYS = []
|
||
|
|
||
|
available_profiles = [
|
||
|
"High KEYS",
|
||
|
"HEVC KEYS",
|
||
|
"HDR-10 KEYS",
|
||
|
"Main KEYS"
|
||
|
]
|
||
|
|
||
|
if not profile in available_profiles:
|
||
|
logger.info("Error: Unknown profile: {}".format(profile))
|
||
|
exit(1)
|
||
|
|
||
|
logger.info(f"\nGetting {profile}...")
|
||
|
|
||
|
profiles = __profiles(profile)
|
||
|
|
||
|
try:
|
||
|
client = MSLClient(profiles=profiles)
|
||
|
resp = client.load_playlist(int(nfID))
|
||
|
if resp is None:
|
||
|
if profile == 'HEVC KEYS':
|
||
|
profiles = __profiles(profile, addHEVCDO=True)
|
||
|
client = MSLClient(profiles=profiles)
|
||
|
resp = client.load_playlist(int(nfID))
|
||
|
|
||
|
except Exception as e:
|
||
|
logger.error("Manifest Error: {}".format(e))
|
||
|
return KEYS
|
||
|
|
||
|
try:
|
||
|
#init_data_b64 = from_kid('0000000005edabd50000000000000000')
|
||
|
init_data_b64 = resp["result"]["video_tracks"][0]["drmHeader"]["bytes"]
|
||
|
except KeyError:
|
||
|
logger.error("cannot get pssh, {}".format(resp))
|
||
|
return KEYS
|
||
|
|
||
|
cert_data_b64 = "CAUSwwUKvQIIAxIQ5US6QAvBDzfTtjb4tU/7QxiH8c+TBSKOAjCCAQoCggEBAObzvlu2hZRsapAPx4Aa4GUZj4/GjxgXUtBH4THSkM40x63wQeyVxlEEo1D/T1FkVM/S+tiKbJiIGaT0Yb5LTAHcJEhODB40TXlwPfcxBjJLfOkF3jP6wIlqbb6OPVkDi6KMTZ3EYL6BEFGfD1ag/LDsPxG6EZIn3k4S3ODcej6YSzG4TnGD0szj5m6uj/2azPZsWAlSNBRUejmP6Tiota7g5u6AWZz0MsgCiEvnxRHmTRee+LO6U4dswzF3Odr2XBPD/hIAtp0RX8JlcGazBS0GABMMo2qNfCiSiGdyl2xZJq4fq99LoVfCLNChkn1N2NIYLrStQHa35pgObvhwi7ECAwEAAToQdGVzdC5uZXRmbGl4LmNvbRKAA4TTLzJbDZaKfozb9vDv5qpW5A/DNL9gbnJJi/AIZB3QOW2veGmKT3xaKNQ4NSvo/EyfVlhc4ujd4QPrFgYztGLNrxeyRF0J8XzGOPsvv9Mc9uLHKfiZQuy21KZYWF7HNedJ4qpAe6gqZ6uq7Se7f2JbelzENX8rsTpppKvkgPRIKLspFwv0EJQLPWD1zjew2PjoGEwJYlKbSbHVcUNygplaGmPkUCBThDh7p/5Lx5ff2d/oPpIlFvhqntmfOfumt4i+ZL3fFaObvkjpQFVAajqmfipY0KAtiUYYJAJSbm2DnrqP7+DmO9hmRMm9uJkXC2MxbmeNtJHAHdbgKsqjLHDiqwk1JplFMoC9KNMp2pUNdX9TkcrtJoEDqIn3zX9p+itdt3a9mVFc7/ZL4xpraYdQvOwP5LmXj9galK3s+eQJ7bkX6cCi+2X+iBmCMx4R0XJ3/1gxiM5LiStibCnfInub1nNgJDojxFA3jH/IuUcblEf/5Y0s1SzokBnR8V0KbA=="
|
||
|
|
||
|
device = tool().devices()["NETFLIX-LICENSE"]
|
||
|
|
||
|
wvdecrypt = WvDecrypt(
|
||
|
init_data_b64=init_data_b64, cert_data_b64=cert_data_b64, device=device
|
||
|
)
|
||
|
challenge = wvdecrypt.get_challenge()
|
||
|
current_sessionId = str(time.time()).replace(".", "")[0:-2]
|
||
|
data = client.get_license(challenge, current_sessionId)
|
||
|
|
||
|
try:
|
||
|
license_b64 = data["result"][0]["licenseResponseBase64"]
|
||
|
except Exception:
|
||
|
logger.error("MSL LICENSE Error Message: {}".format(data))
|
||
|
return KEYS
|
||
|
|
||
|
wvdecrypt.update_license(license_b64)
|
||
|
Correct, keyswvdecrypt = wvdecrypt.start_process()
|
||
|
KEYS = keyswvdecrypt
|
||
|
|
||
|
return KEYS
|