feat(msl): Move functionality from common.py to KodiHelper.py & remove common.py
[plugin.video.netflix.git] / resources / lib / MSL.py
index 58a25f552b00028ddfd3a9e6dffdea98fef0855b..163da5307f13f4c2e6019cd5acdc5467da965ce4 100644 (file)
@@ -18,7 +18,14 @@ from Crypto.Random import get_random_bytes
 # from Crypto.Hash import HMAC, SHA256
 from Crypto.Util import Padding
 import xml.etree.ElementTree as ET
-from lib import log
+from KodiHelper import KodiHelper
+
+plugin_handle = int(sys.argv[1])
+base_url = sys.argv[0]
+kodi_helper = KodiHelper(
+    plugin_handle=plugin_handle,
+    base_url=base_url
+)
 
 pp = pprint.PrettyPrinter(indent=4)
 
@@ -37,7 +44,8 @@ class MSL:
     handshake_performed = False  # Is a handshake already performed and the keys loaded
     last_drm_context = ''
     last_playback_context = ''
-    esn = "NFCDCH-LX-CQE0NU6PA5714R25VPLXVU2A193T36"
+    #esn = "NFCDCH-LX-CQE0NU6PA5714R25VPLXVU2A193T36"
+    esn = "WWW-BROWSE-D7GW1G4NPXGR1F0X1H3EQGY3V1F5WE"
     current_message_id = 0
     session = requests.session()
     rndm = random.SystemRandom()
@@ -54,16 +62,20 @@ class MSL:
         """
         self.email = email
         self.password = password
+        try:
+            os.mkdir(kodi_helper.msl_data_path)
+        except OSError:
+            pass
 
         if self.file_exists('msl_data.json'):
             self.__load_msl_data()
             self.handshake_performed = True
         elif self.file_exists('rsa_key.bin'):
-            log('RSA Keys do already exist load old ones')
+            kodi_helper.log(msg='RSA Keys do already exist load old ones')
             self.__load_rsa_keys()
             self.__perform_key_handshake()
         else:
-            log('Create new RSA Keys')
+            kodi_helper.log(msg='Create new RSA Keys')
             # Create new Key Pair and save
             self.rsa_key = RSA.generate(2048)
             self.__save_rsa_keys()
@@ -107,7 +119,7 @@ class MSL:
 
         try:
             resp.json()
-            log('MANIFEST RESPONE JSON: '+resp.text)
+            kodi_helper.log(msg='MANIFEST RESPONE JSON: '+resp.text)
         except ValueError:
             # Maybe we have a CHUNKED response
             resp = self.__parse_chunked_msl_response(resp.text)
@@ -155,7 +167,7 @@ class MSL:
 
         try:
             resp.json()
-            log('LICENSE RESPONE JSON: '+resp.text)
+            kodi_helper.log(msg='LICENSE RESPONE JSON: '+resp.text)
         except ValueError:
             # Maybe we have a CHUNKED response
             resp = self.__parse_chunked_msl_response(resp.text)
@@ -190,7 +202,7 @@ class MSL:
 
     def __tranform_to_dash(self, manifest):
 
-        self.save_file('/home/johannes/manifest.json', json.dumps(manifest))
+        self.save_file('manifest.json', json.dumps(manifest))
         manifest = manifest['result']['viewables'][0]
 
         self.last_playback_context = manifest['playbackContextId']
@@ -227,7 +239,8 @@ class MSL:
                 rep = ET.SubElement(video_adaption_set, 'Representation',
                                     width=str(downloadable['width']),
                                     height=str(downloadable['height']),
-                                    bitrate=str(downloadable['bitrate']*8*1024),
+                                    bandwidth=str(downloadable['bitrate']*1024),
+                                    codecs='h264',
                                     mimeType='video/mp4')
 
                 #BaseURL
@@ -247,7 +260,7 @@ class MSL:
             for downloadable in audio_track['downloadables']:
                 rep = ET.SubElement(audio_adaption_set, 'Representation',
                                     codecs='aac',
-                                    bitrate=str(downloadable['bitrate'] * 8 * 1024),
+                                    bandwidth=str(downloadable['bitrate']*1024),
                                     mimeType='audio/mp4')
 
                 #AudioChannel Config
@@ -449,21 +462,21 @@ class MSL:
             'headerdata': base64.standard_b64encode(header),
             'signature': '',
         }
-        log('Key Handshake Request:')
-        log(json.dumps(request))
+        kodi_helper.log(msg='Key Handshake Request:')
+        kodi_helper.log(msg=json.dumps(request))
 
 
         resp = self.session.post(self.endpoints['manifest'], json.dumps(request, sort_keys=True))
         if resp.status_code == 200:
             resp = resp.json()
             if 'errordata' in resp:
-                log('Key Exchange failed')
-                log(base64.standard_b64decode(resp['errordata']))
+                kodi_helper.log(msg='Key Exchange failed')
+                kodi_helper.log(msg=base64.standard_b64decode(resp['errordata']))
                 return False
             self.__parse_crypto_keys(json.JSONDecoder().decode(base64.standard_b64decode(resp['headerdata'])))
         else:
-            log('Key Exchange failed')
-            log(resp.text)
+            kodi_helper.log(msg='Key Exchange failed')
+            kodi_helper.log(msg=resp.text)
 
     def __parse_crypto_keys(self, headerdata):
         self.__set_master_token(headerdata['keyresponsedata']['mastertoken'])
@@ -514,7 +527,7 @@ class MSL:
         self.rsa_key = RSA.importKey(loaded_key)
 
     def __save_rsa_keys(self):
-        log('Save RSA Keys')
+        kodi_helper.log(msg='Save RSA Keys')
         # Get the DER Base64 of the keys
         encrypted_key = self.rsa_key.exportKey()
         self.save_file('rsa_key.bin', encrypted_key)
@@ -526,7 +539,7 @@ class MSL:
         :param filename: The filename
         :return: True if so
         """
-        return os.path.isfile(filename)
+        return os.path.isfile(kodi_helper.msl_data_path + filename)
 
     @staticmethod
     def save_file(filename, content):
@@ -535,7 +548,7 @@ class MSL:
         :param filename: The filename
         :param content: The content of the file
         """
-        with open(filename, 'w') as file_:
+        with open(kodi_helper.msl_data_path + filename, 'w') as file_:
             file_.write(content)
             file_.flush()
 
@@ -546,6 +559,6 @@ class MSL:
         :param filename: The file to load
         :return: The content of the file
         """
-        with open(filename) as file_:
+        with open(kodi_helper.msl_data_path + filename) as file_:
             file_content = file_.read()
         return file_content