X-Git-Url: http://git.code-monkey.de/?a=blobdiff_plain;f=resources%2Flib%2FMSL.py;h=163da5307f13f4c2e6019cd5acdc5467da965ce4;hb=3305a89c90f475629a06f4ab96fa6fdf9098dd2f;hp=58a25f552b00028ddfd3a9e6dffdea98fef0855b;hpb=85447a5fdfc7dff80e2272d77a5f94c0eddff1af;p=plugin.video.netflix.git diff --git a/resources/lib/MSL.py b/resources/lib/MSL.py index 58a25f5..163da53 100644 --- a/resources/lib/MSL.py +++ b/resources/lib/MSL.py @@ -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