From 3305a89c90f475629a06f4ab96fa6fdf9098dd2f Mon Sep 17 00:00:00 2001 From: Sebastian Golasch Date: Sat, 4 Feb 2017 16:35:20 +0100 Subject: [PATCH] feat(msl): Move functionality from common.py to KodiHelper.py & remove common.py --- resources/lib/KodiHelper.py | 6 ++-- resources/lib/MSL.py | 40 +++++++++++++++----------- resources/lib/MSLHttpRequestHandler.py | 15 ++++++++-- resources/lib/common.py | 19 ------------ service.py | 14 +++++++-- 5 files changed, 48 insertions(+), 46 deletions(-) delete mode 100644 resources/lib/common.py diff --git a/resources/lib/KodiHelper.py b/resources/lib/KodiHelper.py index 44d992b..27b77f9 100644 --- a/resources/lib/KodiHelper.py +++ b/resources/lib/KodiHelper.py @@ -18,9 +18,6 @@ except: class KodiHelper: """Consumes all the configuration data from Kodi as well as turns data into lists of folders and videos""" - msl_service_server_url = 'http://localhost:%PORT%' - """str: MSL service url""" - def __init__ (self, plugin_handle, base_url): """Fetches all needed info from Kodi & configures the baseline of the plugin @@ -42,6 +39,7 @@ class KodiHelper: self.cookie_path = self.base_data_path + 'COOKIE' self.data_path = self.base_data_path + 'DATA' self.config_path = os.path.join(self.base_data_path, 'config') + self.msl_data_path = xbmc.translatePath('special://profile/addon_data/service.msl').decode('utf-8') + '/' self.verb_log = self.addon.getSetting('logging') == 'true' self.default_fanart = self.addon.getAddonInfo('fanart') self.win = xbmcgui.Window(xbmcgui.getCurrentWindowId()) @@ -647,7 +645,7 @@ class KodiHelper: return False # inputstream addon properties - msl_service_url = self.msl_service_server_url.replace('%PORT%', str(self.addon.getSetting('msl_service_port'))) + msl_service_url = 'http://localhost:' + str(self.addon.getSetting('msl_service_port')) play_item = xbmcgui.ListItem(path=msl_service_url + '/manifest?id=' + video_id) play_item.setProperty(inputstream_addon + '.license_type', 'com.widevine.alpha') play_item.setProperty(inputstream_addon + '.manifest_type', 'mpd') diff --git a/resources/lib/MSL.py b/resources/lib/MSL.py index bbf0e21..163da53 100644 --- a/resources/lib/MSL.py +++ b/resources/lib/MSL.py @@ -18,8 +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 common import log -from common import ADDONUSERDATA +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) @@ -57,7 +63,7 @@ class MSL: self.email = email self.password = password try: - os.mkdir(ADDONUSERDATA) + os.mkdir(kodi_helper.msl_data_path) except OSError: pass @@ -65,11 +71,11 @@ class MSL: 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() @@ -113,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) @@ -161,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) @@ -456,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']) @@ -521,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) @@ -533,7 +539,7 @@ class MSL: :param filename: The filename :return: True if so """ - return os.path.isfile(ADDONUSERDATA + filename) + return os.path.isfile(kodi_helper.msl_data_path + filename) @staticmethod def save_file(filename, content): @@ -542,7 +548,7 @@ class MSL: :param filename: The filename :param content: The content of the file """ - with open(ADDONUSERDATA + filename, 'w') as file_: + with open(kodi_helper.msl_data_path + filename, 'w') as file_: file_.write(content) file_.flush() @@ -553,6 +559,6 @@ class MSL: :param filename: The file to load :return: The content of the file """ - with open(ADDONUSERDATA + filename) as file_: + with open(kodi_helper.msl_data_path + filename) as file_: file_content = file_.read() return file_content diff --git a/resources/lib/MSLHttpRequestHandler.py b/resources/lib/MSLHttpRequestHandler.py index 395dd5a..c9e01d0 100644 --- a/resources/lib/MSLHttpRequestHandler.py +++ b/resources/lib/MSLHttpRequestHandler.py @@ -3,9 +3,18 @@ import base64 from urlparse import urlparse, parse_qs from MSL import MSL -from common import ADDON -email = ADDON.getSetting('email') -password = ADDON.getSetting('password') +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 +) + +account = kodi_helper.addon.get_credentials() +email = account['email'] +password = account['password'] msl = MSL(email, password) class MSLHttpRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler): diff --git a/resources/lib/common.py b/resources/lib/common.py deleted file mode 100644 index d197938..0000000 --- a/resources/lib/common.py +++ /dev/null @@ -1,19 +0,0 @@ -import os -import xbmc -import xbmcaddon -import xbmcgui -import xbmcvfs - -ADDON = xbmcaddon.Addon() -ADDONVERSION = ADDON.getAddonInfo('version') -ADDONNAME = ADDON.getAddonInfo('name') -ADDONPATH = ADDON.getAddonInfo('path').decode('utf-8') -ADDONPROFILE = xbmc.translatePath( ADDON.getAddonInfo('profile') ).decode('utf-8') -ADDONUSERDATA = xbmc.translatePath("special://profile/addon_data/service.msl").decode('utf-8') + "/" -ICON = ADDON.getAddonInfo('icon') - -def log(txt): - if isinstance (txt,str): - txt = txt.decode("utf-8") - message = u'%s: %s' % ("service.msl", txt) - xbmc.log(msg=message.encode("utf-8"), level=xbmc.LOGDEBUG) diff --git a/service.py b/service.py index 2af9813..12d8ab8 100644 --- a/service.py +++ b/service.py @@ -3,7 +3,7 @@ import SocketServer import xbmc import xbmcaddon import socket -from resources.lib.common import log +from resources.lib.KodiHelper import KodiHelper from resources.lib.MSLHttpRequestHandler import MSLHttpRequestHandler def select_unused_port(): @@ -13,10 +13,18 @@ def select_unused_port(): s.close() return port +plugin_handle = int(sys.argv[1]) +base_url = sys.argv[0] addon = xbmcaddon.Addon() + +kodi_helper = KodiHelper( + plugin_handle=plugin_handle, + base_url=base_url +) + PORT = select_unused_port() addon.setSetting('msl_service_port', str(PORT)) -log("Picked Port: " + str(PORT)) +kodi_helper.log(msg='Picked Port: ' + str(PORT)) Handler = MSLHttpRequestHandler SocketServer.TCPServer.allow_reuse_address = True server = SocketServer.TCPServer(('127.0.0.1', PORT), Handler) @@ -37,4 +45,4 @@ if __name__ == '__main__': server.server_close() server.socket.close() server.shutdown() - log("Stopped MSL Service") + kodi_helper.log(msg='Stopped MSL Service') -- 2.30.2