Metadata-Version: 2.1
Name: pymsl
Version: 1.2
Summary: Python library for interacting with the Netflix MSL API
Home-page: https://github.com/truedread/pymsl
Author: truedread
Author-email: truedread11@gmail.com
License: GNU GPLv3
Platform: UNKNOWN
Classifier: Environment :: Console
Classifier: License :: OSI Approved :: GNU General Public License v3 (GPLv3)
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python :: 3.3
Classifier: Programming Language :: Python :: 3.4
Classifier: Programming Language :: Python :: 3.5
Classifier: Programming Language :: Python :: 3.6
Classifier: Programming Language :: Python :: 3.7
Classifier: Topic :: Utilities
Description-Content-Type: text/markdown
Requires-Dist: pycryptodomex
Requires-Dist: requests

# pymsl
[![Build Status](https://travis-ci.com/truedread/pymsl.svg?branch=master)](https://travis-ci.com/truedread/pymsl)
[![License: GPL v3](https://img.shields.io/badge/License-GPL%20v3-blue.svg)](https://www.gnu.org/licenses/gpl-3.0)

Python library for interacting with the Netflix MSL API

# Usage

### Basic Usage

```python
>>> import pymsl
>>> 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 Kwargs

`pymsl.MslClient()` takes additional kwargs as well to override the defaults; the only required arg for initialization is user_auth_data:

```python
>>> 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']
...     extra_manifest_params=EXTRA_MANIFEST_PARAMS # default is a blank dict
... )
```

- `esn` is the identity used for communicating with MSL. Different ESNs have different priveleges.
- `drm_system` will determine what kind of initialization data you will receive in the manifest.
- `profiles` is a list of profiles used for telling MSL what you want to receive in the manifest.
- `keypair` is the RSA keypair used in the initial key exchange.
- `message_id` is a random integer used for identifying the MSL client session.
- `languages` is a list of languages used for determining the language of the manifest received.
- `extra_manifest_params` is a dict of extra manifest params. Here's the default manifest params sent in a manifest request:

```python
'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 wanted `showAllSubDubTracks` to be true, you would set `extra_manifest_params` to `{'showAllSubDubTracks': True}`. The manifest param dict is simply `.update()`'ed with `extra_manifest_params`, so you can overwrite default values or add new ones.

### Methods

#### `load_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.
```

# Installation

To install, you can either clone the repository and run `python setup.py install` or you can run `pip install pymsl`

# To-Do

- [x] Implement license acquisition
- [ ] Clean up chunked payload parsing


