Package: pymsl
pymslPython library for interacting with the Netflix MSL APIUsageBasic Usage>>>importpymsl>>>user_auth_data={...'scheme':'EMAIL_PASSWORD',...'authdata':{...'email':email,...'password':password...}...}>>>client=pymsl.MslClient(user_auth_data)>>>client.load_manifest(80092521){'version':2,...All user authentication schemes are defined in the MSL wiki:https://github.com/Netflix/msl/wiki/User-Authentication-(Configuration)Custom Kwargspymsl.MslClient()takes additional kwargs as well to override the defaults; the only required arg for initialization is user_auth_data:>>>pymsl.MslClient(...user_auth_data,...esn=CUSTOM_ESN,# default is NFCDCH-02-[random device ID]...drm_system=CUSTOM_DRM_SYSTEM,# default is 'widevine', you can use 'playready', 'fps', etc....profiles=LIST_OF_PROFILES,# default is ['playready-h264mpl30-dash', 'playready-h264mpl31-dash', 'playready-h264mpl40-dash', 'heaac-2-dash', 'simplesdh', 'nflx-cmisc', 'BIF240', 'BIF320']...keypair=CUSTOM_CRYPTODOME_RSA_KEYPAIR,# default is a random 2048-bit keypair...message_id=CUSTOM_MESSAGE_ID,# default is a random integer between 0 and 2^52...languages=LIST_OF_LANGUAGES,# default is ['en_US']...proxies=PROXIES,# default is None...key_request_data=CUSTOM_KEY_REQUEST_DATA,# default is ASYMMETRIC_WRAPPED...extra_manifest_params=EXTRA_MANIFEST_PARAMS# default is a blank dict...)esnis the identity used for communicating with MSL. Different ESNs have different priveleges.drm_systemwill determine what kind of initialization data you will receive in the manifest.profilesis a list of profiles used for telling MSL what you want to receive in the manifest.keypairis the RSA keypair used in the initial key exchange.message_idis a random integer used for identifying the MSL client session.languagesis a list of languages used for determining the language of the manifest received.proxiesis a proxy dict passed the same way you would pass it to therequestslibrary.key_request_datais a dict passed to override the normalASYMMETRIC_WRAPPEDkey request dict in order to enable using other key exchange mechanisms. Note that you may have to monkey patch theparse_handshakefunction in order for it to work with your specified key exchange mechanism.extra_manifest_paramsis a dict of extra manifest params. Here's the default manifest params sent in a manifest request:'params':{'type':'standard','viewableId':viewable_id,'profiles':self.msl_session['profiles'],'flavor':'STANDARD','drmType':self.msl_session['drm_system'],'drmVersion':25,'usePsshBox':True,'isBranching':False,'useHttpsStreams':True,'imageSubtitleHeight':720,'uiVersion':'shakti-v4bf615c3','clientVersion':'6.0011.511.011','supportsPreReleasePin':True,'supportsWatermark':True,'showAllSubDubTracks':False,'videoOutputInfo':[{'type':'DigitalVideoOutputDescriptor','outputType':'unknown','supportedHdcpVersions':[],'isHdcpEngaged':False}],'preferAssistiveAudio':False,'isNonMember':False}By using this kwarg you can add any values you want to this param dict. For example, if you wantedshowAllSubDubTracksto be true, you would setextra_manifest_paramsto{'showAllSubDubTracks': True}. The manifest param dict is simply.update()'ed withextra_manifest_params, so you can overwrite default values or add new ones.Methodsload_manifest(viewable_id)@param viewable_ids: Int of viewable ID
                     to obtain manifest for

@return: manifest (dict)

This function performs a manifest request based on
the parameters supplied when initalizing the client
object. If there are no errors, it will return the
manifest as a dict. If there are errors, it will
raise a ManifestError exception with the response
from the MSL API as the body.get_license(challenge, session_id)@param challenge:  EME license request as a byte string
                   that will be used to obtain a license

@param session_id: DRM specific session ID passed as a string

@return: license (dict)

This function performs a license request based on
the parameters supplied when initalizing the client
object. If there are no errors, it will return the
licenses as a list of dicts. If there are errors, it will
raise a LicenseError exception with the response
from the MSL API as the body.InstallationTo install, you can either clone the repository and runpython setup.py installor you can runpip install pymslTo-DoImplement license acquisitionClean up chunked payload parsing