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

115 lines
16 KiB
Plaintext
Raw Normal View History

2026-05-29 17:53:25 +08:00
o
‹ZjßYã@sddlZddlZddlZddlZddlZddlZddlZddlZddlm Z ddl
m Z ddl m Z m
Z
ddlmZmZmZmZmZddlmZmZddlmZmZddlmZdd lmZdd
lmZdd l m!Z!dd l"m#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Ú
PKCS1_OAEP)ÚHMACÚSHA256)ÚRSA)ÚRsaKey)Úget_random_bytes)ÚPadding)ÚCdmÚDeviceÚPSSHc@seZdZdefdd„ZdS)Ú MSLObjectÚreturncCs d|jj›dtj|dd�›d�S)NÚ<Ú F©Ú unpicklableÚ>)Ú __class__Ú__name__Ú
jsonpickleÚencode)Úself©r"ú7F:\Pari\PERSONAL-PROJECT\VT-STAGING\k\modules\msl_tv.pyÚ__repr__s zMSLObject.__repr__N)rÚ
__module__Ú __qualname__Ústrr$r"r"r"r#rsrc @sFeZdZ     d deedeedeedeedef
dd„ZdS)
ÚMSLKeysNÚ
encryptionÚsignÚrsaÚ mastertokenÚ cdm_sessioncCs"||_||_||_||_||_dS©N)r)r*r+r,r-)r!r)r*r+r,r-r"r"r#Ú__init__s

zMSLKeys.__init__)NNNNN) rr%r&r ÚbytesrÚdictrr/r"r"r"r#r(s"úþýüûúr(c@sÄeZdZdZdZdddœZdZdZdZd Z d
Z
ddd d d
dddœZ gd¢Z dZ
 didejdedededeedef dd„Ze  djdedejdedededed eeeefded!eed"eeeefd#efd$d%„ƒZe      &  ' ( dkd)ed*eed+eed,eed-eed.eed/eed0eeeefd1eed2eed3eed#eeeffd4d5„ƒZed#eeeeefffd6d7„ƒZe   8dldeded9ed:eed;eed<eed#efd=d>„ƒZed?e de!ed@e!ed#ee fdAdB„ƒZ"   dmd!edCeeefdDeeefd:eed"eedEeeeefd#eeeefeffdFdG„Z#ed!edDed#efdHdI„ƒZ$edDeeefd#efdJdK„ƒZ%edDeeefd!ed#eefdLdM„ƒZ&dndDeeefd:eed#efdNdO„Z'dPe!eeefd#efdQdR„Z(edSed#e!eeeffdTdU„ƒZ)dSed#eeeefeffdVdW„Z*edXe d#e fdYdZ„ƒZ+ed[ed#e fd\d]„ƒZ,d^ed#efd_d`„Z-daed#e fdbdc„Z.edndee/d#eefddde„ƒZ0edfede/d#dfdgdh„ƒZ1dS)oÚMSL_TVzGhttps://nrdp25.prod.ftl.netflix.com/nq/nrdjs/pbo_tokens/%5E1.0.0/routerz7https://api-global.netflix.com/playapi/nrdjs/manifest/1Údarwinz
2025.2.3.0)Ú ab_ui_verÚnrdapp_versionz{Netflix/2025.2.3.0 (DEVTYPE=NFANDROID2-PRV-NVIDIASHIELDANDROIDTV2019; Milo=1.0.6315; build_number=6315; build_sha=a1b915de)z,{"appstate":"foreground","reason":"unknown"}zv3.12.55z3.0.5éz~12.1.9-23083 R 2025.2 android-30-JPLAYER2 ninja_6==NVIDIA/mdarcy/mdarcy:11/RQ1A.210105.003/7825230_4040.2147:user/release-keyszFUI-release-20260407_44745-gibbon-r100-darwinql-69067=5,80198=2,80211=3Útv_uiz12.1.9)ÚsdkÚplatformÚ applicationÚ uiversionÚ
uiPlatformÚ
clientVersionÚ
apkVersion©zen-USzen-PHÚenzNVIDIA_SHIELD%20Android%20TVNÚwidevineÚsessionÚkeysÚ
message_idÚsenderÚ user_authÚdrmcCs(||_||_||_||_||_||_dSr.)rBrCrErFrDrG)r!rBrCrDrErFrGr"r"r#r/Gs  
zMSL_TV.__init__Ú
msl_keys_pathÚcdmÚ
cdm_deviceÚnew_mslÚcookiesÚendpointÚheadersrc Cs„|r|j |¡t|ƒ} t | ¡} | dur|s| St dtddƒ¡}
tƒ} |sO|dkrOt  
d¡| _ | j dus8J‚dddt  
| j  ¡jd d
�¡ d ¡d œd
œ}n=|dkr…t|tƒsbt |¡}t |¡}| ¡}|| _| |tjtjjd�¡}t  
|¡ d ¡}dd|id
œ}ntd|›�ƒ‚tjdd|idœt   tj!|
|d|d� d ¡¡ d ¡ddœdd�}|t" #t   t" #|
ddddœ¡ d ¡¡ d ¡ddœ¡7}| pË|j$}|
pÖ|j%d|dd d!�}|j&|||d"d#�}|j'd$krõt(d%|j'›d&|j)dd'…›�ƒ‚| *|j)¡}|�st(d(ƒ‚|d}d)|v�r!t  +|d)¡ d ¡}t" ,|¡}t(d*|›�ƒ‚d+|v�r3t(d,t-|ƒdd'…›�ƒ‚t" ,t  +|d+¡ d ¡¡}|d-}|d.}|�r{| .| j|d/¡| /| j¡}tj0t  +|d0¡|d1d2gd3�| _1tj0t  +|d4¡|d5d6gd3�| _2n:| j du�sƒJ‚t3 | j ¡}t 4t" ,| 5t  +|d7¡¡ d ¡¡d8¡| _1t 4t" ,| 5t  +|d9¡¡ d ¡¡d8¡| _2|d:| _6t 7| | ¡| S);Nrr6é4rAiZASYMMETRIC_WRAPPEDZ rsaKeypairIdZJWK_RSAÚDER)Úformatúutf-8)Z keypairidZ mechanismÚ publickey)ÚschemeÚkeydata)Ú system_idÚWIDEVINEÚ
keyrequestzUnsupported DRM mode: ÚNONEÚidentity)rTÚauthdataT)rDrEÚ is_handshakeÚkeyrequestdataÚ)ÚentityauthdataÚ
headerdataÚ signatureFré)Ú messageidÚdataÚsequencenumberÚendofmsg©ÚpayloadraÚ mintCookiesúnrdp25.prod.ftl.netflix.comúen-US,en-PH,en)Ú request_nameÚesnÚhostÚlanguageé)ÚurlrdrNÚtimeoutéÈzKey exchange failed: HTTP riôz'Key exchange failed: empty MSL responseÚ errordatazKey exchange failed: r`z5Key exchange failed: missing headerdata in response: ÚkeyresponsedatarUÚcdmkeyresponseÚencryptionkeyidÚ AllowEncryptÚ AllowDecrypt)ÚkidrCÚ permissionsÚ hmackeyidÚ AllowSignÚAllowSignatureVerifyZ
encryptionkeyÚkZhmackeyr,)8rLÚupdaterr2Úload_cache_dataÚrandomÚrandintÚpowr(rÚgenerater+Úbase64Ú b64encoderSÚ
export_keyÚdecodeÚ
isinstanceÚ WidevineCdmÚWidevineDeviceÚloadÚ from_deviceÚopenr-Úget_license_challengerÚnewÚSystemIdÚWidevineÚ
ValueErrorrr Ú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 Úbase64key_decodeÚdecryptr,Ú
cache_keys) ÚclsrHrBrErIrJrKrLrGrMrNÚ
cache_pathÚmsl_keysrDr]Údevicer-Ú challengeÚ
wv_requestrdÚhandshake_endpointÚhandshake_headersÚresÚparsedÚ key_exchangeÚ
decoded_errorÚ
error_jsonÚ header_jsonÚkey_response_dataÚkey_datarCZ
cipher_rsar"r"r#Ú handshakeWsø 
   ÿûþ


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


ÿ  ý 
ý ÿþÿÿþÿ
 zMSL_TV.handshakeéÎ1rjrkrlÚ
user_agentÚrefererÚ viewable_idÚ profile_guidrmÚexpiry_timeoutÚ
extra_headersrnroÚ device_modelc Csöid|pd“d| p
d“d|ptj“dd“dd “d
d “d d
“dd“dd“dtt dd¡ƒ“d|
p1tj“dtj“d|“dd“dd“dtj“dtj“ddi¥} |durVt|ƒ| d<|r\|| d <|durft|ƒ| d!<|rl|| d"<|rr|| d#<|ry|   |¡| S)$NÚHostrjÚLanguagerkz
User-AgentÚAcceptz*/*Ú
Connectionz
Keep-AlivezAccept-Encodingz deflate,gzipz Content-Typezapplication/jsonzX-Gibbon-Cache-Controlzno-cachezX-AllowCompressionÚtruezX-Client-Request-Idl;á lÿÇNÎZoz
X-DeviceModelzx-netflix.client.nrdjs.versionzX-Netflix.Client.Request.NamezX-Netflix.request.attemptÚ1z!X-Netflix.Request.NonJson.Headersz X-Netflix.Request.Client.Contextzx-netflix.client.netjs.versionz%x-netflix.client.last-interacted-daysÚ0z x-netflix.request.expiry.timeoutÚRefererz+x-netflix.playback.main-content-viewable-idz%x-netflix.client.current-profile-guidzx-netflix.client.ftl.esn)
r2ÚDEFAULT_USER_AGENTr'r‚rƒÚDEFAULT_DEVICE_MODELÚDEFAULT_NRDJS_VERSIONÚDEFAULT_REQUEST_CONTEXTÚDEFAULT_NETJS_VERSIONr€) rlrºr»r¼r½rmr¾r¿rnrorÀrNr"r"r#ršðsdÿþ
ýüûúùø ÷
ö
õ ô
óòñðïî  
zMSL_TV.build_request_headerscCstjttjƒfSr.)r2ÚDEFAULT_MANIFEST_ENDPOINTr1ÚDEFAULT_MANIFEST_PARAMSr"r"r"r#Úmanifest_request_defaults sz MSL_TV.manifest_request_defaultsÚGZIPr\Ú userauthdatar]Ú compressionc Csf|d||r|gnggd¢dgdœtt tj¡ ¡ƒ|dddœ}|r%||d<|r,|g|d <tj|dd
�S) NTr?ÚJSON)ÚcompressionalgosÚ languagesÚencoderformatsFÚNetflix)rcÚ renewabler¸Ú capabilitiesÚ timestamprEÚ
nonreplayableÚ recipientrÒr]r)ÚintrÚnowrÚutcrÛrr )rDrEr\rÒr]rÓÚ header_datar"r"r#r–$s"
 ýô
zMSL_TV.generate_msg_headerrzr{cs`ddl‰‡fdd„|Dƒ}|D]}|jdkrqdd„t|ddƒp!gDƒ}||kr-|jSqdS)Nrcsh|] }ˆ dd|¡ ¡’qS)z(?<!^)(?=[A-Z])Ú_)ÚsubÚlower©Ú.0Úp©Úrer"r#Ú <setcomp>Dsz*MSL_TV.get_widevine_key.<locals>.<setcomp>ÚOPERATOR_SESSIONcSsh|]}| ¡’qSr")rärår"r"r#rêHsr{)réÚtypeÚgetattrÚkey)rzrCr{Únormalized_permsrîÚ key_permsr"rèr#r¤As

ÿzMSL_TV.get_widevine_keyÚparamsÚapplication_dataÚproxycCsš| ||¡}| ||¡}||||ddœ} |r|| d<|jjdi| ¤Ž}
| |
j¡\} } d| vrIt t  | d 
d¡¡  d¡¡}
t  
td|
›�ƒ¡| | fS)Nrp)rqrdrñrNrrÚproxiesrtrRz MSL response contains an error: r")Únormalize_application_dataÚcreate_messagerBr›Ú
parse_messageržr—r¡r†r r r‰ÚsysÚexitÚprint)r!rMrñròrÒrNróÚnormalized_application_dataÚmessageÚrequest_kwargsr°ÚheaderÚ payload_datar³r"r"r#Ú send_messageMs$ ûÿzMSL_TV.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ñ)rrrqrÖrñ)ÚpathÚmethodÚrouterM>rrMrÖrrrrñr) rŠr1Ú_looks_like_wrapped_pbo_payloadÚ_extract_pbo_routeÚDEFAULT_PBO_COMMONÚgetr€ÚDEFAULT_PBO_VERSIONÚlistÚDEFAULT_PBO_LANGUAGESÚpopÚitems)r¨rMròrrÚwrappedrîÚvaluer"r"r#rõjs.

 
 
û
z!MSL_TV.normalize_application_datacCs(d|vod|vod|vod|vod|vS)NrrrqrÖrñr")ròr"r"r#r‹sÿþýûz&MSL_TV._looks_like_wrapped_pbo_payloadcCszdD]$}| |¡}t|tƒr| ¡sq| ¡}| d¡r |Sd|›�S| ¡}d|vr1dSd|vs9d|vr;dSdS)N)rqrrrrMú/Úmanifestz /manifestÚ
pbo_tokensÚ
pbo_config)r rŠr'ÚstripÚ
startswithrä)ròrMrîrÚendpoint_lowerr"r"r#r•s
 zMSL_TV._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)NrbF)rDrEr\rÒrR)r`rar,)ú,ú:)Ú
separatorsrÑ)rercÚcompressionalgordr6Tr^)rercrfrdrg)rDÚencryptr–rEr—r˜r†r•r r‰r*rCr,Ú
gzip_compress) r!ròrÒr`rüÚcompressed_application_dataÚ
payload_dictsÚ payload_dictÚ
payload_chunkr"r"r#rö¥sRüÿ ýú ÿþüüùþ
ûzMSL_TV.create_messageÚpayload_chunksc Csd}|jjdus
J‚|D]S}t t |d¡ d¡¡}tj|jjtj t |d¡d� 
t |d¡¡}t   |d¡}t | d¡¡}t |d¡}| 
d ¡d
krXt |dtj¡}|| d¡7}q |sddSzt |¡}Wn tyv|YSwd |vr}dSd |vrƒ|S|d S)