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%Gdd„de%ƒZ&Gdd„dƒZ'dS)éN)ÚBytesIO)ÚPath)ÚdatetimeÚtimezone)ÚAnyÚDictÚListÚOptionalÚTuple)ÚAES)ÚHMACÚSHA256)ÚRsaKey)Úget_random_bytes)ÚPadding)ÚCdmÚDeviceÚPSSHc@seZdZdefdd„ZdS)Ú MSLObjectÚreturncCs d|jj›dtj|dd�›d�S)NÚ<Ú F©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
dd„ZdS)
Ú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@sÄeZdZdZdZdddœZdZdZdZd Z d
Z
ddd ddddd œZ d
dgZ dZ
 dfdejdedededeedef dd„Ze  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  Csº|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%|v�r 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 Ú handshakePsÈ 
 


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

ÿ  ý ý
 zMSL_ANDROID.handshakeéÎ1r_r`Ú
user_agentÚrefererÚ viewable_idÚ profile_guidraÚexpiry_timeoutÚ
extra_headersrbrcÚ device_modelc Csid|pd“dd“d|ptj“d| pd“dd “d
d “d d
“dd“d|
p%tj“d|“dd“dd dd„tdƒDƒ¡“dtj“dd“dd“dd“dd “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>ðs€z4MSL_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`r›rœr�ržrarŸr rbrcr¡rJrrr 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@rArRr½rSr¾Ú header_datarrr r€s"
 ýô
zMSL_ANDROID.generate_msg_headerrjrkcs`ddl‰‡fdd„|Dƒ}|D]}|jdkrqdd„t|ddƒp!gDƒ}||kr-|jSqdS)Nrcsh|] }ˆ dd|¡ ¡’qS)z(?<!^)(?=[A-Z])rª)ÚsubÚlower©r©Úp©Úrerr Ú <setcomp>8sz/MSL_ANDROID.get_widevine_key.<locals>.<setcomp>ÚOPERATOR_SESSIONcSsh|]}| ¡’qSr)rÇrÈrrr rÌ<srk)rËÚtypeÚgetattrÚkey)rjr?rkZnormalized_permsrÐZ key_permsrrÊr rŽ5s

ÿzMSL_ANDROID.get_widevine_keyÚparamsÚapplication_dataÚproxycCs(| ||¡}| ||¡}||||ddœ} |r|| d<|jjdi| ¤Ž}
|
jdkr8td|
j›d|
jdd…›�ƒ‚|
jp<d} |  ¡} | sGtd ƒ‚|  d
¡sa|
j  
d d¡}
td |
›d
| dd…›�ƒ‚|  | ¡\}}|sutd| dd…›�ƒ‚d|vr�t  
t |d d¡¡ d¡¡}td|›�ƒ‚||fS)Nrd)rerYrÑrJrfÚ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_messager�r‹r|rŠrr~)rrIrÑrÒr½rJrÓZnormalized_application_dataÚmessageZrequest_kwargsr–Ú
response_textZstripped_responseÚ content_typeÚheaderÚ payload_datar˜rrr Ú send_messageAsN û
ÿ

ÿ
ÿÿÿÿzMSL_ANDROID.send_messagecCsÒt|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)NÚcommonÚversionr¿rÑ)rãrârer¿rÑ)ÚpathÚmethodÚrouterI>rIrår¿rÑrärârærã) rrr.Ú_looks_like_wrapped_pbo_payloadÚ_extract_pbo_routeÚDEFAULT_PBO_COMMONrÚrlÚDEFAULT_PBO_VERSIONÚlistÚDEFAULT_PBO_LANGUAGESÚpopÚitems)r�rIrÒrærâÚwrappedrÐÚvaluerrr rÖws.

 
 
û
z&MSL_ANDROID.normalize_application_datacCs(d|vod|vod|vod|vod|vS)Nrãrârer¿rÑr)rÒrrr rç˜sÿþýûz+MSL_ANDROID._looks_like_wrapped_pbo_payloadcCszdD]$}| |¡}t|tƒr| ¡sq| ¡}| d¡r |Sd|›�S| ¡}d|vr1dSd|vs9d|vr;dSdS)N)rerärærårIú/Zmanifestz /manifestZ
pbo_tokensZ
pbo_config)rÚrrr$ÚstriprÙrÇ)rÒrIrÐrðZendpoint_lowerrrr rè¢s
 zMSL_ANDROID._extract_pbo_routec Csú|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œdd�7}qS|S)NrWF)r@rArRr½rM)rUrVr))ú,ú:)Ú
separatorsr¼)rZrXÚcompressionalgorYr3TrT)rZrXr[rYr\)r@Úencryptr€rAr�r‚r|rrr~r'r?r)Ú
gzip_compress) rrÒr½rUrÜZcompressed_application_dataZ
payload_dictsZ payload_dictÚ
payload_chunkrrr rײsRüÿ ýú ÿþüüùþ