# 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)
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()
"""
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()
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)
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)
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']
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
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
'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'])
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)
: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):
: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()
: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