Files
NF-MSL/modules/__pycache__/msl_android.cpython-310.pyc
T

113 lines
17 KiB
Plaintext
Raw Normal View History

2026-05-29 17:53:25 +08:00
o
²Zj
Zã@sddlZddlZddlZddlZddlZddlZddlZddlZddlm Z ddl
m Z ddl m Z m
Z
ddlmZmZmZmZmZddlmZddlmZmZddlmZdd lmZdd
lmZdd lm Z!m"Z#m$Z$Gd d
d
ƒZ%Gddde%ƒZ&GdddƒZ'dS)éN)ÚBytesIO)ÚPath)ÚdatetimeÚtimezone)ÚAnyÚDictÚListÚOptionalÚTuple)ÚAES)ÚHMACÚSHA256)ÚRsaKey)Úget_random_bytes)ÚPadding)ÚCdmÚDeviceÚPSSHc@seZdZdefddZdS)Ú MSLObjectÚreturncCs d|jjdtj|dddS)Z unpicklableÚ>)Ú __class__Ú__name__Ú
jsonpickleÚencode)Úself©rú<F:\Pari\PERSONAL-PROJECT\VT-STAGING\k\modules\msl_android.pyÚ__repr__s zMSLObject.__repr__N)rÚ
__module__Ú __qualname__Ústrr!rrrr rsrc @sFeZdZ     d deedeedeedeedef
ddZdS)
ÚMSLKeysNÚ
encryptionÚsignÚrsaÚ mastertokenÚ cdm_sessioncCs"||_||_||_||_||_dS©N)r&r'r(r)r*)rr&r'r(r)r*rrr Ú__init__s

zMSLKeys.__init__)NNNNN) rr"r#r ÚbytesrÚdictrr,rrrr r%s"úþýüûúr%c@eZdZdZdZdddœZdZdZdZd Z d
Z
ddd ddddd œZ d
dgZ dZ
 dfdejdedededeedef ddZe  dgdedejdededededeeeefdedeed eeeefd!efd"d#„ƒZe      $  %
dhd&ed'eed(eed)eed*eed+eed,eed-eeeefd.eed/eed0eed!eeeffd1d2„ƒZed!eeeeefffd3d4„ƒZe   5dideded6ed7eed8eed9eed!efd:d;„ƒZed<e de!ed=e!ed!ee fd>d?„ƒZ"   djded@eeefdAeeefd7eed eedBeeeefd!eeeefeffdCdD„Z#ededAed!efdEdF„ƒZ$edAeeefd!efdGdH„ƒZ%edAeeefded!eefdIdJ„ƒZ&dkdAeeefd7eed!efdKdL„Z'dMe!eeefd!efdNdO„Z(edPed!e!eeeffdQdR„ƒZ)dPed!eeeefeffdSdT„Z*edUe d!e fdVdW„ƒZ+edXed!e fdYdZ„ƒZ,d[ed!efd\d]„Z-d^ed!e fd_d`„Z.edkdee/d!eefdadb„ƒZ0edcede/d!dfddde„ƒZ1dS)lÚ MSL_ANDROIDzKhttps://android.prod.ftl.netflix.com/nq/androidui/pbo_license/~1.0.0/routerzAhttps://android.prod.ftl.netflix.com/msl/playapi/android/manifestÚandroidz18.26.0)Ú ab_ui_verÚnrdapp_versionztcom.netflix.mediaclient/63988 (Linux; U; Android 15; en_US; SM-F711N; Build/AP3A.240905.015.A2; Cronet/143.0.7445.0)z-{"appState":"foreground","appView":"unknown"}zv3.12.55z3.0.5ézNetflix Android 18.26.0)ÚsdkÚplatformÚ applicationÚ uiversionÚ
uiPlatformÚ
clientVersionÚ
apkVersionúen-USÚenzSM-F711NNÚwidevineÚsessionÚkeysÚ
message_idÚsenderÚ user_authÚdrmcCs(||_||_||_||_||_||_dSr+)r>r?rArBr@rC)rr>r?r@rArBrCrrr r,@s  
zMSL_ANDROID.__init__Ú
msl_keys_pathÚcdmÚ
cdm_deviceÚnew_mslÚcookiesÚendpointÚheadersrc  C|r|j |¡t|ƒ} t | ¡} | dur|s| S|dkr$td|ƒ|s*tdƒt dtddƒ¡}
t ƒ} t
|t ƒsEt  
|¡}t  |¡}| ¡}|| _| |tjtjjd¡}t |¡ d¡}d d
|id œ}tjd d
|idœt tj|
|d|d d¡¡ d¡ddœdd}|t t t |
ddddœ¡ d¡¡ d¡ddœ¡7}| p¦|j}|
p±|j d|ddd}|j!|||dd}|j"dkrÐt#d|j"d |j$dd!…ƒ| %|j$¡}|sÜt#d"ƒ|d}d#|vrút &|d#¡ d¡}t '|¡}t#d$|ƒd%|vr t#d&t(|ƒdd!…ƒt 't &|d%¡ d¡¡}|d'}|d(}| )| j|d)¡| *| j¡}tj+t &|d*¡|d+d,gd-| _,tj+t &|d.¡|d/d0gd-| _-|d1| _.t /| | ¡| S)2Nr=zUnsupported DRM mode: z.Widevine CDM is required for this iOS MSL flowrr3é4)Ú system_idúutf-8ZWIDEVINEZ
keyrequest)ÚschemeÚkeydataÚNONEÚidentity)rNZauthdataT)r@rAÚ is_handshakeÚkeyrequestdataÚ)ZentityauthdataÚ
headerdataÚ signatureFré)Ú messageidÚdataÚsequencenumberÚendofmsg©ÚpayloadrVÚ mintCookiesú android15.prod.cloud.netflix.comzen-US,en)Ú request_nameÚesnÚhostÚlanguageé)ÚurlrYrJÚtimeoutéÈzKey exchange failed: HTTP réôz'Key exchange failed: empty MSL responseÚ errordatazKey exchange failed: rUz5Key exchange failed: missing headerdata in response: ZkeyresponsedatarOZcdmkeyresponseZencryptionkeyidZ AllowEncryptZ AllowDecrypt)Úkidr?Ú permissionsZ hmackeyidZ AllowSignZAllowSignatureVerifyr))0rHÚupdaterr/Úload_cache_dataÚ
ValueErrorÚrandomÚrandintÚpowr%Ú
isinstanceÚ WidevineCdmÚWidevineDeviceÚloadÚ from_deviceÚopenr*Úget_license_challengerÚnewÚSystemIdÚWidevineÚbase64Ú b64encodeÚdecoderrÚstandard_b64encodeÚgenerate_msg_headerÚjsonÚdumpsÚDEFAULT_HANDSHAKE_ENDPOINTÚbuild_request_headersÚpostÚ status_codeÚ RuntimeErrorÚtextÚparse_concatenated_jsonÚstandard_b64decodeÚloadsr$Ú
parse_licenseÚget_keysÚget_widevine_keyr&r'r)Ú
cache_keys)ÚclsrDr>rArErFrGrHrCrIrJÚ
cache_pathÚmsl_keysr@Údevicer*Ú challengeZ
wv_requestrSrYZhandshake_endpointÚhandshake_headersÚresÚparsedZ key_exchangeÚ
decoded_errorZ
error_jsonZ header_jsonZkey_response_dataZkey_datar?rrr Ú handshakeP 
 


þÿþÿþüúñîüÿø õÿ
ü
  

ÿ  ý ý
 zMSL_ANDROID.handshakeéÎ1r_r`Ú
user_agentÚrefererÚ viewable_idÚ profile_guidraÚexpiry_timeoutÚ
extra_headersrbrcÚ device_modelc Csid|pdddd|ptjd| pddd “d
d d d
ddd|
p%tjd|dddd ddtdƒDƒ¡dtjdddddddd “d!d"d"d#d$d%d%d&d'd'd'd(dd)d*œ¥} |ra|| d+<|durkt|ƒ| d,<|rq|| d-<|r{|| d.<|| d/<|dur…t|ƒ| d0<|rŒ|  |¡| S)1NÚHostr_ÚAcceptz*/*z
User-AgentzAccept-Languager;zAccept-Encodingzgzip, deflate, brz Content-Typezapplication/jsonÚ
Connectionz
keep-alivezContent-EncodingÚmsl_v1z
X-DeviceModelzx-netflix.client.request.namezx-netflix.request.attemptÚ1zx-netflix.request.idrTcss|]}t d¡VqdS)Ú0123456789abcdefN)roÚchoice)Ú.0Ú_rrr Ú <genexpr>ðsz4MSL_ANDROID.build_request_headers.<locals>.<genexpr>é z x-netflix.request.client.contextz"x-netflix.request.client.languagesz#x-netflix.request.client.timezoneidzAmerica/New_Yorkzx-netflix.clienttypeÚsamuraizx-netflix.deviceformfactorÚPHONEÚHIGHÚ35Úphoner0z9.60.0zNFANDROID1-PRV-P-Útruez2{"path":"\/nq\/android\/playback\/~1.0.0\/router"}zcom.android.vending)zx-netflix.devicememorylevelzx-netflix.androidapizx-netflix.context.os-versionzx-netflix.context.form-factorzx-netflix.context.ui-flavorzx-netflix.appverzx-netflix.context.app-versionzx-netflix.esnprefixzx-netflix.zuul.brotli.allowedz*x-netflix.request.client.supportskidstop10z&x-netflix.request.client.supportsgameszx-netflix.request.routingzx-netflix.context.localesz*x-netflix.context.android.installer-sourceÚRefererz+x-netflix.playback.main-content-viewable-idz%x-netflix.client.current-profile-guidzx-netflix.client.ftl.esnz
x-netflix.esnz x-netflix.request.expiry.timeout)r/ÚDEFAULT_USER_AGENTÚDEFAULT_DEVICE_MODELÚjoinÚrangeÚDEFAULT_REQUEST_CONTEXTr$rl) r`rrrar rbrcrJrrr r„Ös€ÿþ
ýüûúùø
÷
ö õ ô
óòñðïá!  
z!MSL_ANDROID.build_request_headerscCstjttjƒfSr+)r/ÚDEFAULT_MANIFEST_ENDPOINTr.ÚDEFAULT_MANIFEST_PARAMSrrrr Úmanifest_request_defaultssz%MSL_ANDROID.manifest_request_defaultsÚGZIPrRÚ userauthdatarSÚ compressionc Csf|d||r|gngddgdgdœtt tj¡ ¡ƒ|dddœ}|r%||d <|r,|g|d
<tj|dd S) NTr;r<ZJSON)ZcompressionalgosÚ languagesZencoderformatsFZNetflix)rXZ renewabler™Ú capabilitiesÚ timestamprAZ
nonreplayableZ recipientr½rSr)ÚintrÚnowrÚutcrÁrr)r@rArRrSÚ header_datarrr r€s"
 ýô
zMSL_ANDROID.generate_msg_headerrjrkcs`ddlfdd|Dƒ}|D]}|jdkrqddt|ddƒp!gDƒ}||kr-|jSqdS)Nrcsh|] }ˆ dd|¡ ¡qS)z(?<!^)(?=[A-Z])rª)ÚsubÚlower©ÚÚrerr Ú <setcomp>8sz/MSL_ANDROID.get_widevine_key.<locals>.<setcomp>ÚOPERATOR_SESSIONcSsh|]}| ¡qSr)rrr <srk)ÚtypeÚgetattrÚkey)rjr?rkZnormalized_permsrÐZ key_permsrr 5s

ÿzMSL_ANDROID.get_widevine_keyÚparamsÚapplication_dataÚproxycCs(| ||¡}| ||¡}||||ddœ} |r|| d<|jjdi| ¤Ž}
|
jdkr8td|
jd|
jddƒ|
jp<d} |  ¡} | sGtd ƒ|  d
¡sa|
j  
d d¡}
td |
d
| ddƒ|  | ¡\}}|sutd| ddƒd|vrt  
t |d d¡¡ d¡¡}td|ƒ||fS)Nrd)rerYrJrfÚproxiesrgzMSL request failed with HTTP z: rhrTz'MSL request failed: empty response bodyÚ{z content-typezSMSL request failed: the server did not return concatenated MSL JSON. Content-Type: z. Body preview: zMMSL request failed: parsed response does not contain a header. Body preview: rirMz MSL response contains an error: r)Únormalize_application_dataÚcreate_messager>r…r†r‡rˆÚlstripÚ
startswithrJÚgetÚ
parse_messagerrr|rr~)rrIrJZnormalized_application_dataÚmessageZrequest_kwargsrÚ
response_textZstripped_responseÚ content_typeÚheaderÚ payload_datar˜rrr Ú send_messageAsN û
ÿ

ÿ
ÿÿÿÿzMSL_ANDROID.send_messagecCt|tƒs|S| |¡r|S| ||¡}|dur|St|jƒ}t| d¡tƒr.| |d¡| d|j¡||| dt|j ƒ¡| di¡dœ}dD]}| 
|d¡qH|  ¡D]\}}||vsa|dvrbqU|||<qU|S)commonÚversionr¿)rer¿)ÚpathÚmethodÚrouterI>rIr¿) rrr.Ú_looks_like_wrapped_pbo_payloadÚ_extract_pbo_routeÚDEFAULT_PBO_COMMONrÚrlÚDEFAULT_PBO_VERSIONÚlistÚDEFAULT_PBO_LANGUAGESÚpopÚitems)rrIÚwrappedrÐÚvaluerrr ws.

 
 
û
z&MSL_ANDROID.normalize_application_datacCs(d|vod|vod|vod|vod|vS)Nrãrer¿r)rrr ˜sÿþýûz+MSL_ANDROID._looks_like_wrapped_pbo_payloadcCszdD]$}| |¡}t|tƒr| ¡sq| ¡}| d¡r |Sd|S| ¡}d|vr1dSd|vs9d|vr;dSdS)N)rerIú/Zmanifestz /manifestZ
pbo_tokensZ
pbo_config)rrr$ÚstriprÙ)rIZendpoint_lowerrrr ¢s
 zMSL_ANDROID._extract_pbo_routec C|jd7_| |j|j|jd|d¡}tjt | d¡¡  d¡| 
|¡  d¡|j j dœdd}| 
tj|dd d¡¡  d¡}d|jd|d œd
|jd d d
œg}|D]'}| tj|dd¡}|tjt | d¡¡  d¡| 
|¡  d¡dœdd7}qS|S)NrWF)r@rArRrM)rUrVr))ú:)Ú
separatorsr¼)rZrXÚcompressionalgorYr3TrT)rZrXr[rYr\)r@Úencryptr€rArrr|rrr~r'r?r)Ú
gzip_compress) rrUZcompressed_application_dataZ
payload_dictsZ payload_dictÚ
payload_chunkrrr rײsRüÿ ýú ÿþüüùþ