diff --git a/default.py b/default.py index e5b1da5..a02fa3b 100644 --- a/default.py +++ b/default.py @@ -1694,7 +1694,7 @@ def checkServer(): printDebug ("Getting user list") jsonData = None try: - jsonData = downloadUtils.downloadUrl(server_address + ":" + server_port + "/mediabrowser/Users?format=json") + jsonData = downloadUtils.downloadUrl(server_address + ":" + server_port + "/mediabrowser/Users?format=json", authenticate=False) except Exception, msg: error = "Get User unable to connect to " + server_address + ":" + server_port + " : " + str(msg) xbmc.log (error) diff --git a/resources/lib/ArtworkLoader.py b/resources/lib/ArtworkLoader.py index bbe6af2..87b8d6f 100644 --- a/resources/lib/ArtworkLoader.py +++ b/resources/lib/ArtworkLoader.py @@ -152,7 +152,6 @@ class ArtworkRotationThread(threading.Thread): WINDOW.setProperty("MB3.Background.Global.FanArt.Action", result.get("global")["action"]) self.logMsg("MB3.Background.Global.FanArt.Action=" + result.get("global")["action"], level=2) - def saveLastBackground(self): data = {} diff --git a/resources/lib/DownloadUtils.py b/resources/lib/DownloadUtils.py index 6e608e2..209976b 100644 --- a/resources/lib/DownloadUtils.py +++ b/resources/lib/DownloadUtils.py @@ -9,9 +9,9 @@ import hashlib import StringIO import gzip import sys -import inspect +#import inspect import json as json -from random import randrange +#from random import randrange from uuid import getnode as get_mac from ClientInformation import ClientInformation @@ -33,100 +33,9 @@ class DownloadUtils(): if(self.logLevel >= level): xbmc.log("MBCon DownloadUtils -> " + msg) - def getUserId(self): - - port = self.addonSettings.getSetting('port') - host = self.addonSettings.getSetting('ipaddress') - userName = self.addonSettings.getSetting('username') - - self.logMsg("Looking for user name: " + userName) - - jsonData = None - try: - jsonData = self.downloadUrl(host + ":" + port + "/mediabrowser/Users/Public?format=json") - except Exception, msg: - error = "Get User unable to connect to " + host + ":" + port + " : " + str(msg) - xbmc.log (error) - return "" - - self.logMsg("GETUSER_JSONDATA_01:" + str(jsonData)) - - result = [] - - try: - result = json.loads(jsonData) - except Exception, e: - self.logMsg("jsonload : " + str(e) + " (" + jsonData + ")", level=1) - return "" - - self.logMsg("GETUSER_JSONDATA_02:" + str(result)) - - userid = "" - secure = False - for user in result: - if(user.get("Name") == userName): - userid = user.get("Id") - self.logMsg("Username Found:" + user.get("Name")) - if(user.get("HasPassword") == True): - secure = True - self.logMsg("Username Is Secure (HasPassword=True)") - break - - if(secure): - authOk = self.authenticate() - if(authOk == False): - return_value = xbmcgui.Dialog().ok(self.getString(30044), self.getString(30044)) - sys.exit() - - if userid == "": - return_value = xbmcgui.Dialog().ok(self.getString(30045),self.getString(30045)) - sys.exit() - - self.logMsg("userid : " + userid) - - WINDOW = xbmcgui.Window( 10000 ) - WINDOW.setProperty("userid", userid) - - return userid - def getMachineId(self): return "%012X"%get_mac() - def authenticate(self): - - self.addonSettings.setSetting('AccessToken', "") - - port = self.addonSettings.getSetting("port") - host = self.addonSettings.getSetting("ipaddress") - if(host == None or host == "" or port == None or port == ""): - return False - - url = "http://" + self.addonSettings.getSetting("ipaddress") + ":" + self.addonSettings.getSetting("port") + "/mediabrowser/Users/AuthenticateByName?format=json" - - txt_mac = self.getMachineId() - version = ClientInformation().getVersion() - - deviceName = self.addonSettings.getSetting('deviceName') - deviceName = deviceName.replace("\"", "_") - - authString = "Mediabrowser Client=\"XBMC\",Device=\"" + deviceName + "\",DeviceId=\"" + txt_mac + "\",Version=\"" + version + "\"" - headers = {'Accept-encoding': 'gzip', 'Authorization' : authString} - sha1 = hashlib.sha1(self.addonSettings.getSetting('password')) - - resp = requests.post(url, data={'password':sha1.hexdigest(),'Username':self.addonSettings.getSetting('username')}, headers=headers) - code = str(resp.status_code) - result = resp.json() - - if result.get("AccessToken") != self.addonSettings.getSetting('AccessToken'): - self.addonSettings.setSetting('AccessToken', result.get("AccessToken")) - - if int(code) >= 200 and int(code) < 300: - self.logMsg("User Authenticated") - return True - else: - self.logMsg("User NOT Authenticated") - return False - def getArtwork(self, data, type, index = "0"): id = data.get("Id") @@ -175,24 +84,6 @@ class DownloadUtils(): artwork = '' ''' return artwork - - def getUserArtwork(self, data, type, index = "0"): - - id = data.get("Id") - #query = "&type=" + type + "&tag=" + imageTag - query = "" - height = "60" - width = "60" - played = "0" - - # use the local image proxy server that is made available by this addons service - port = self.addonSettings.getSetting('port') - host = self.addonSettings.getSetting('ipaddress') - server = host + ":" + port - - artwork = "http://" + server + "/mediabrowser/Users/" + str(id) + "/Images/Primary/0" + "?height=60&width=60&format=png" - - return artwork def imageUrl(self, id, type, index, width, height): @@ -202,38 +93,152 @@ class DownloadUtils(): return "http://" + server + "/mediabrowser/Items/" + str(id) + "/Images/" + type + "/" + str(index) + "/e3ab56fe27d389446754d0fb04910a34/original/" + str(height) + "/" + str(width) + "/0" - def downloadUrl(self, url, suppress=False, type="GET", popup=0 ): + def getUserId(self): + + WINDOW = xbmcgui.Window( 10000 ) + userid = WINDOW.getProperty("userid") + + if(userid != None and userid != ""): + xbmc.log("MBCon DownloadUtils -> Returning saved UserID : " + userid) + return userid + + port = self.addonSettings.getSetting('port') + host = self.addonSettings.getSetting('ipaddress') + userName = self.addonSettings.getSetting('username') + + self.logMsg("Looking for user name: " + userName) + + jsonData = None + try: + jsonData = self.downloadUrl(host + ":" + port + "/mediabrowser/Users/Public?format=json", authenticate=False) + except Exception, msg: + error = "Get User unable to connect to " + host + ":" + port + " : " + str(msg) + xbmc.log (error) + return "" + + self.logMsg("GETUSER_JSONDATA_01:" + str(jsonData)) + + result = [] + + try: + result = json.loads(jsonData) + except Exception, e: + self.logMsg("jsonload : " + str(e) + " (" + jsonData + ")", level=1) + return "" + + self.logMsg("GETUSER_JSONDATA_02:" + str(result)) + + userid = "" + secure = False + for user in result: + if(user.get("Name") == userName): + userid = user.get("Id") + self.logMsg("Username Found:" + user.get("Name")) + if(user.get("HasPassword") == True): + secure = True + self.logMsg("Username Is Secure (HasPassword=True)") + break + + if(secure): + authOk = self.authenticate() + if(authOk == ""): + return_value = xbmcgui.Dialog().ok(self.getString(30044), self.getString(30044)) + return "" + + if userid == "": + return_value = xbmcgui.Dialog().ok(self.getString(30045),self.getString(30045)) + + self.logMsg("userid : " + userid) + + WINDOW.setProperty("userid", userid) + + return userid + + def authenticate(self): + + WINDOW = xbmcgui.Window( 10000 ) + + token = WINDOW.getProperty("AccessToken") + if(token != None and token != ""): + xbmc.log("MBCon DownloadUtils -> Returning saved AccessToken : " + token) + return token + + port = self.addonSettings.getSetting("port") + host = self.addonSettings.getSetting("ipaddress") + if(host == None or host == "" or port == None or port == ""): + return "" + + url = "http://" + self.addonSettings.getSetting("ipaddress") + ":" + self.addonSettings.getSetting("port") + "/mediabrowser/Users/AuthenticateByName?format=json" + + txt_mac = self.getMachineId() + version = ClientInformation().getVersion() + + deviceName = self.addonSettings.getSetting('deviceName') + deviceName = deviceName.replace("\"", "_") + + authString = "Mediabrowser Client=\"XBMC\",Device=\"" + deviceName + "\",DeviceId=\"" + txt_mac + "\",Version=\"" + version + "\"" + headers = {'Accept-encoding': 'gzip', 'Authorization' : authString} + sha1 = hashlib.sha1(self.addonSettings.getSetting('password')) + + resp = requests.post(url, data={'password':sha1.hexdigest(),'Username':self.addonSettings.getSetting('username')}, headers=headers) + code = str(resp.status_code) + result = resp.json() + + accessToken = result.get("AccessToken") + + if int(code) >= 200 and int(code) < 300 and accessToken != None: + self.logMsg("User Authenticated : " + accessToken) + WINDOW.setProperty("AccessToken", accessToken) + return accessToken + else: + self.logMsg("User NOT Authenticated") + WINDOW.setProperty("AccessToken", "") + return "" + + def getAuthHeader(self): + txt_mac = self.getMachineId() + version = ClientInformation().getVersion() + + userid = self.getUserId() + + deviceName = self.addonSettings.getSetting('deviceName') + deviceName = deviceName.replace("\"", "_") + + authString = "MediaBrowser UserId=\"" + userid + "\",Client=\"XBMC\",Device=\"" + deviceName + "\",DeviceId=\"" + txt_mac + "\",Version=\"" + version + "\"" + headers = {"Accept-encoding": "gzip", "Accept-Charset" : "UTF-8,*", "Authorization" : authString} + + authToken = self.authenticate() + if(authToken != ""): + headers["X-MediaBrowser-Token"] = authToken + + xbmc.log("MBCon Authentication Header : " + str(headers)) + return headers + + def downloadUrl(self, url, suppress=False, type="GET", popup=0, authenticate=True): self.logMsg("== ENTER: getURL ==") link = "" try: if url[0:4] == "http": - serversplit=2 - urlsplit=3 + serversplit = 2 + urlsplit = 3 else: - serversplit=0 - urlsplit=1 + serversplit = 0 + urlsplit = 1 - server =url.split('/')[serversplit] + server = url.split('/')[serversplit] urlPath = "/"+"/".join(url.split('/')[urlsplit:]) self.logMsg("DOWNLOAD_URL = " + url) self.logMsg("server = "+str(server), level=2) self.logMsg("urlPath = "+str(urlPath), level=2) conn = httplib.HTTPConnection(server, timeout=20) - #head = {"Accept-Encoding" : "gzip,deflate", "Accept-Charset" : "UTF-8,*"} - if(self.addonSettings.getSetting('AccessToken') == None): - self.addonSettings.setSetting('AccessToken', '') - - authToken = self.addonSettings.getSetting('AccessToken') - if(authToken != None and authToken != ""): - head = {"Accept-Encoding" : "gzip", "Accept-Charset" : "UTF-8,*", "X-MediaBrowser-Token" : authToken} - else: - head = {"Accept-Encoding" : "gzip", "Accept-Charset" : "UTF-8,*"} - self.logMsg("HEADERS : " + str(head), level=1) - #head = getAuthHeader() + head = {} + if(authenticate): + head = self.getAuthHeader() + self.logMsg("HEADERS : " + str(head), level=1) + conn.request(method=type, url=urlPath, headers=head) - #conn.request(method=type, url=urlPath) data = conn.getresponse() self.logMsg("GET URL HEADERS : " + str(data.getheaders()), level=2)