diff --git a/default.py b/default.py index e9df628..e80daf2 100644 --- a/default.py +++ b/default.py @@ -20,19 +20,27 @@ ''' import os +import logging import xbmcplugin import xbmcgui import xbmcaddon -__settings__ = xbmcaddon.Addon(id='plugin.video.embycon') -__cwd__ = __settings__.getAddonInfo('path') -BASE_RESOURCE_PATH = xbmc.translatePath( os.path.join( __cwd__, 'resources', 'lib' ) ) +addonSettings = xbmcaddon.Addon(id='plugin.video.embycon') +addonPath = addonSettings.getAddonInfo('path') +BASE_RESOURCE_PATH = xbmc.translatePath( os.path.join( addonPath, 'resources', 'lib' ) ) sys.path.append(BASE_RESOURCE_PATH) -import Functions +import loghandler +import functions -Functions.mainEntryPoint() +log_level = addonSettings.getSetting('logLevel') +loghandler.config(int(log_level)) +log = logging.getLogger("EmbyCon.default") + +log.info("About to enter mainEntryPoint()") + +functions.mainEntryPoint() #clear done and exit. #sys.modules.clear() diff --git a/resources/lib/Functions.py b/resources/lib/Functions.py index 9728fef..dc80d2c 100644 --- a/resources/lib/Functions.py +++ b/resources/lib/Functions.py @@ -20,6 +20,7 @@ ''' #import ptvsd +import logging import struct import urllib import glob @@ -62,20 +63,14 @@ __addondir__ = xbmc.translatePath( __addon__.getAddonInfo('profile')) __cwd__ = __settings__.getAddonInfo('path') PLUGINPATH = xbmc.translatePath(os.path.join( __cwd__)) -logLevel = 0 -try: - logLevel = int(__settings__.getSetting('logLevel')) -except: - pass - -#xbmc.log("EmbyCon -> LogLevel: " + str(logLevel)) +log = logging.getLogger("EmbyCon." + __name__) downloadUtils = DownloadUtils() dataManager = DataManager() def mainEntryPoint(): - printDebug("===== EmbyCon START =====") + log.info("===== EmbyCon START =====") ProfileCode = __settings__.getSetting('profile') == "true" @@ -85,17 +80,17 @@ def mainEntryPoint(): pr.enable() ADDON_VERSION = ClientInformation().getVersion() - printDebug("EmbyCon -> running Python: " + str(sys.version_info)) - printDebug("EmbyCon -> running EmbyCon: " + str(ADDON_VERSION)) - printDebug(xbmc.getInfoLabel( "System.BuildVersion" )) - printDebug( "EmbyCon -> Script argument date " + str(sys.argv)) + log.info("EmbyCon -> running Python: " + str(sys.version_info)) + log.info("EmbyCon -> running EmbyCon: " + str(ADDON_VERSION)) + log.info(xbmc.getInfoLabel( "System.BuildVersion" )) + log.info( "EmbyCon -> Script argument date " + str(sys.argv)) try: params = get_params(sys.argv[2]) except: params = {} - printDebug("EmbyCon -> Script params is " + str(params)) + log.info("EmbyCon -> Script params = " + str(params)) param_url = params.get('url', None) @@ -126,7 +121,7 @@ def mainEntryPoint(): __settings__.openSettings() WINDOW = xbmcgui.getCurrentWindowId() if WINDOW == 10000: - printDebug("Currently in home - refreshing to allow new settings to be taken") + log.info("Currently in home - refreshing to allow new settings to be taken") xbmc.executebuiltin("XBMC.ActivateWindow(Home)") elif sys.argv[1] == "refresh": WINDOW = xbmcgui.Window( 10000 ) @@ -153,8 +148,8 @@ def mainEntryPoint(): WINDOW = xbmcgui.Window( 10000 ) WINDOW.clearProperty("heading") - printDebug("EmbyCon -> Mode: " + str(mode)) - printDebug("EmbyCon -> URL: " + str(param_url)) + log.info("EmbyCon -> Mode: " + str(mode)) + log.info("EmbyCon -> URL: " + str(param_url)) #Run a function based on the mode variable that was passed in the URL #if ( mode == None or param_url == None or len(param_url) < 1 ): @@ -188,22 +183,11 @@ def mainEntryPoint(): f.write(str(ncalls) + "\t" + "{0}".format(total_time) + "\t" + "{0}".format(cumulative_time) + "\t" + func_name + "\t" + filename + "\r\n") f.close() - printDebug("===== EmbyCon FINISHED =====") - -def printDebug( msg, level = 1): - if(logLevel >= level): - if(logLevel == 2): - stackline = "" - stack = inspect.stack() - for frame in stack: - stackline = stackline + "." + frame[3] - xbmc.log("EmbyCon " + str(level) + " -> (" + stackline + ") : " + str(msg)) - else: - xbmc.log("EmbyCon " + str(level) + " -> " + str(msg)) + log.info("===== EmbyCon FINISHED =====") def getServerDetails(): - printDebug("Getting Server Details from Network") + log.info("Getting Server Details from Network") MESSAGE = "who is EmbyServer?" MULTI_GROUP = ("", 7359) @@ -217,8 +201,8 @@ def getServerDetails(): sock.setsockopt(socket.SOL_IP, socket.IP_MULTICAST_LOOP, 1) sock.setsockopt(socket.IPPROTO_IP, socket.SO_REUSEADDR, 1) - xbmc.log("MutliGroup : " + str(MULTI_GROUP)); - xbmc.log("Sending UDP Data : " + MESSAGE); + log.info("MutliGroup : " + str(MULTI_GROUP)); + log.info("Sending UDP Data : " + MESSAGE); sock.sendto(MESSAGE, MULTI_GROUP) servers = [] @@ -231,11 +215,11 @@ def getServerDetails(): xbmc.log("Read UPD responce: %s" % e) break - xbmc.log("Found Servers: %s" % servers) + log.info("Found Servers: %s" % servers) return servers def getCollections(detailsString): - printDebug("== ENTER: getCollections ==") + log.info("== ENTER: getCollections ==") MB_server = __settings__.getSetting('ipaddress') + ":" + __settings__.getSetting('port') @@ -248,18 +232,18 @@ def getCollections(detailsString): jsonData = downloadUtils.downloadUrl(MB_server + "/mediabrowser/Users/" + userid + "/Items/Root?format=json") except Exception, msg: error = "Get connect : " + str(msg) - xbmc.log (error) + log.error(error) return {} - printDebug("jsonData : " + jsonData, level=2) + log.debug("jsonData : " + jsonData) result = json.loads(jsonData) parentid = result.get("Id") - printDebug("parentid : " + parentid) + log.info("parentid : " + parentid) htmlpath = ("http://%s/mediabrowser/Users/" % MB_server) jsonData = downloadUtils.downloadUrl(htmlpath + userid + "/items?ParentId=" + parentid + "&Sortby=SortName&format=json") - printDebug("jsonData : " + jsonData, level=2) + log.debug("jsonData : " + jsonData) collections=[] if jsonData is False: @@ -270,7 +254,7 @@ def getCollections(detailsString): for item in result: if(item.get("RecursiveItemCount") != "0"): - Name =(item.get("Name")).encode('utf-8') + Name = (item.get("Name")).encode('utf-8') total = str(item.get("RecursiveItemCount")) section = item.get("CollectionType") @@ -287,7 +271,7 @@ def getCollections(detailsString): 'guiid' : item.get("Id"), 'path' : ('/mediabrowser/Users/' + userid + '/items?ParentId=' + item.get("Id") + '&IsVirtualUnaired=false&IsMissing=False&Fields=' + detailsString + '&CollapseBoxSetItems=true&ImageTypeLimit=1&format=json')}) - printDebug("Title " + Name) + log.info("Title " + Name) # Add standard nodes collections.append({'title': "All Movies", 'sectype' : 'std.movies', 'section' : 'movies' , 'address' : MB_server , 'path' : '/mediabrowser/Users/' + userid + '/Items?Fields=' + detailsString + '&Recursive=true&IncludeItemTypes=Movie&CollapseBoxSetItems=true&ImageTypeLimit=1&format=json' ,'thumb':'', 'poster':'', 'fanart_image':'', 'guiid':''}) @@ -307,7 +291,7 @@ def getCollections(detailsString): return collections def markWatched(item_id): - printDebug("Mark Item Watched : " + item_id) + log.info("Mark Item Watched : " + item_id) userId = downloadUtils.getUserId() server = __settings__.getSetting('ipaddress') + ":" + __settings__.getSetting('port') url = "http://" + server + "/mediabrowser/Users/" + userId + "/PlayedItems/" + item_id @@ -317,7 +301,7 @@ def markWatched(item_id): xbmc.executebuiltin("Container.Refresh") def markUnwatched(item_id): - printDebug("Mark Item UnWatched : " + item_id) + log.info("Mark Item UnWatched : " + item_id) userId = downloadUtils.getUserId() server = __settings__.getSetting('ipaddress') + ":" + __settings__.getSetting('port') url = "http://" + server + "/mediabrowser/Users/" + userId + "/PlayedItems/" + item_id @@ -327,7 +311,7 @@ def markUnwatched(item_id): xbmc.executebuiltin("Container.Refresh") def markFavorite(item_id): - printDebug("Add item to favourites : " + item_id) + log.info("Add item to favourites : " + item_id) userId = downloadUtils.getUserId() server = __settings__.getSetting('ipaddress') + ":" + __settings__.getSetting('port') url = "http://" + server + "/mediabrowser/Users/" + userId + "/FavoriteItems/" + item_id @@ -337,7 +321,7 @@ def markFavorite(item_id): xbmc.executebuiltin("Container.Refresh") def unmarkFavorite(item_id): - printDebug("Remove item from favourites : " + item_id) + log.info("Remove item from favourites : " + item_id) userId = downloadUtils.getUserId() server = __settings__.getSetting('ipaddress') + ":" + __settings__.getSetting('port') url = "http://" + server + "/mediabrowser/Users/" + userId + "/FavoriteItems/" + item_id @@ -349,7 +333,7 @@ def unmarkFavorite(item_id): def delete (item_id): return_value = xbmcgui.Dialog().yesno(__language__(30091),__language__(30092)) if return_value: - printDebug('Deleting Item : ' + item_id) + log.info('Deleting Item : ' + item_id) server = __settings__.getSetting('ipaddress') + ":" + __settings__.getSetting('port') url = 'http://' + server + '/mediabrowser/Items/' + item_id progress = xbmcgui.DialogProgress() @@ -362,10 +346,10 @@ def addGUIItem( url, details, extraData, folder=True ): url = url.encode('utf-8') - printDebug("Adding GuiItem for [%s]" % details.get('title','Unknown'), level=2) - printDebug("Passed details: " + str(details), level=2) - printDebug("Passed extraData: " + str(extraData), level=2) - #printDebug("urladdgui:" + str(url)) + log.debug("Adding GuiItem for [%s]" % details.get('title','Unknown')) + log.debug("Passed details: " + str(details)) + log.debug("Passed extraData: " + str(extraData)) + if details.get('title', '') == '': return @@ -435,7 +419,7 @@ def addGUIItem( url, details, extraData, folder=True ): details['title'] = listItemName list = xbmcgui.ListItem(listItemName, iconImage=thumbPath, thumbnailImage=thumbPath, offscreen=True) - printDebug("Setting thumbnail as " + thumbPath, level=2) + log.debug("Setting thumbnail as " + thumbPath) # calculate percentage if (cappedPercentage != None): @@ -453,7 +437,7 @@ def addGUIItem( url, details, extraData, folder=True ): for artType in artTypes: imagePath = str(extraData.get(artType,'')) list = setArt(list, artType, imagePath) - printDebug( "Setting " + artType + " as " + imagePath, level=2) + log.debug( "Setting " + artType + " as " + imagePath) menuItems = addContextMenu(details, extraData, folder) if(len(menuItems) > 0): @@ -510,7 +494,6 @@ def addGUIItem( url, details, extraData, folder=True ): return (u, list, folder) def addContextMenu(details, extraData, folder): - printDebug("Building Context Menus", level=2) commands = [] item_id = extraData.get('id') @@ -548,7 +531,7 @@ def getDetailsString(): return detailsString def displaySections( pluginhandle, filter=None ): - printDebug("== ENTER: displaySections() ==") + log.info("== ENTER: displaySections() ==") xbmcplugin.setContent(pluginhandle, 'files') dirItems = [] @@ -569,7 +552,7 @@ def displaySections( pluginhandle, filter=None ): extraData['fanart_image'] = collection['fanart_image'] extraData['guiid'] = collection['guiid'] s_url = 'http://%s%s' % ( collection['address'], path) - printDebug("addGUIItem:" + str(s_url) + str(details) + str(extraData)) + log.info("addGUIItem:" + str(s_url) + str(details) + str(extraData)) dirItems.append(addGUIItem(s_url, details, extraData)) #All XML entries have been parsed and we are ready to allow the user to browse around. So end the screen listing. @@ -581,21 +564,21 @@ def remove_html_tags( data ): return p.sub('', data) def PLAY( url, handle ): - printDebug("== ENTER: PLAY ==") + log.info("== ENTER: PLAY ==") #playData = json.loads(url) url=urllib.unquote(url) urlParts = url.split(',;') - xbmc.log("PLAY ACTION URL PARTS : " + str(urlParts)) + log.info("PLAY ACTION URL PARTS : " + str(urlParts)) server = urlParts[0] id = urlParts[1] autoResume = 0 if(len(urlParts) > 2): autoResume = int(urlParts[2]) - xbmc.log("PLAY ACTION URL AUTO RESUME : " + str(autoResume)) + log.info("PLAY ACTION URL AUTO RESUME : " + str(autoResume)) ip,port = server.split(':') userid = downloadUtils.getUserId() @@ -630,7 +613,7 @@ def PLAY( url, handle ): #playlist.clear() playurl = PlayUtils().getPlayUrl(server, id, result) - printDebug("Play URL: " + playurl) + log.info("Play URL: " + playurl) thumbPath = downloadUtils.getArtwork(result, "Primary") listItem = xbmcgui.ListItem(path=playurl, iconImage=thumbPath, thumbnailImage=thumbPath) @@ -656,7 +639,7 @@ def PLAY( url, handle ): #Set a loop to wait for positive confirmation of playback count = 0 while not xbmc.Player().isPlaying(): - printDebug( "Not playing yet...sleep for 1 sec") + log.info( "Not playing yet...sleep for 1 sec") count = count + 1 if count >= 10: return @@ -703,7 +686,7 @@ def setListItemProps(server, id, listItem, result): return def get_params( paramstring ): - printDebug("Parameter string: " + paramstring, level=2) + log.debug("Parameter string: " + paramstring) param={} if len(paramstring) >= 2: params=paramstring @@ -724,13 +707,13 @@ def get_params( paramstring ): param[splitparams[0]]=splitparams[1] elif (len(splitparams))==3: param[splitparams[0]]=splitparams[1]+"="+splitparams[2] - printDebug("EmbyCon -> Detected parameters: " + str(param), level=2) + log.debug("EmbyCon -> Detected parameters: " + str(param)) return param def getContent(url, pluginhandle): - printDebug("== ENTER: getContent ==") - printDebug("URL: " + str(url)) + log.info("== ENTER: getContent ==") + log.info("URL: " + str(url)) xbmcplugin.addSortMethod(pluginhandle, xbmcplugin.SORT_METHOD_LABEL) xbmcplugin.addSortMethod(pluginhandle, xbmcplugin.SORT_METHOD_VIDEO_SORT_TITLE_IGNORE_THE) @@ -758,21 +741,17 @@ def getContent(url, pluginhandle): progress.close() return - #printDebug("JSON DATA: " + str(result), level=2) - dirItems, viewType = processDirectory(url, result, progress, pluginhandle) xbmcplugin.addDirectoryItems(pluginhandle, dirItems) if(viewType != None and len(viewType) > 0): defaultData = DefaultViews.loadSkinDefaults() viewNum = defaultData.get(viewType) - printDebug("SETTING_VIEW : " + str(viewType) + " : " + str(viewNum), level=1) + log.info("SETTING_VIEW : " + str(viewType) + " : " + str(viewNum)) if viewNum != None and viewNum != "": xbmc.executebuiltin("Container.SetViewMode(%s)" % int(viewNum)) xbmcplugin.endOfDirectory(pluginhandle, cacheToDisc=False) - - if(progress != None): progress.update(100, __language__(30125)) @@ -785,11 +764,11 @@ def loadJasonData(jsonData): def processDirectory(url, results, progress, pluginhandle): cast = ['None'] - printDebug("== ENTER: processDirectory ==") + log.info("== ENTER: processDirectory ==") parsed = urlparse(url) parsedserver,parsedport=parsed.netloc.split(':') userid = downloadUtils.getUserId() - printDebug("Processing secondary menus") + xbmcplugin.setContent(pluginhandle, 'movies') server = getServerFromURL(url) @@ -1078,31 +1057,31 @@ def getLinkURL( url, pathData, server ): @ input: url, XML data and PM server address @ return: Usable http URL ''' - printDebug("== ENTER: getLinkURL ==") - path=pathData.get('key','') - printDebug("Path is " + path) + log.info("== ENTER: getLinkURL ==") + path = pathData.get('key','') + log.info("Path is: " + path) if path == '': - printDebug("Empty Path") + log.error("Empty Path") return #If key starts with http, then return it if path[0:4] == "http": - printDebug("Detected http link") + log.info("Detected http link") return path #If key starts with a / then prefix with server address elif path[0] == '/': - printDebug("Detected base path link") + log.info("Detected base path link") return 'http://%s%s' % ( server, path ) elif path[0:5] == "rtmp:": - printDebug("Detected link") + log.info("Detected link") return path #Any thing else is assumed to be a relative path and is built on existing url else: - printDebug("Detected relative link") + log.info("Detected relative link") return "%s/%s" % ( url, path ) return url @@ -1122,16 +1101,16 @@ def getXbmcVersion(): result = result.get("result") versionData = result.get("version") version = float(str(versionData.get("major")) + "." + str(versionData.get("minor"))) - printDebug("Version : " + str(version) + " - " + str(versionData), level=0) + log.info("Version : " + str(version) + " - " + str(versionData)) except: version = 0.0 - printDebug("Version Error : RAW Version Data : " + str(result), level=0) + log.error("Version Error : RAW Version Data : " + str(result)) return version def getCastList(pluginName, handle, params): - printDebug ("EmbyCon Returning Cast List") + log.info("EmbyCon Returning Cast List") port = __settings__.getSetting('port') host = __settings__.getSetting('ipaddress') @@ -1142,7 +1121,7 @@ def getCastList(pluginName, handle, params): # get the cast list for an item jsonData = downloadUtils.downloadUrl("http://" + server + "/mediabrowser/Users/" + userid + "/Items/" + params.get("id") + "?format=json", suppress=False, popup=1 ) - printDebug("CastList(Items) jsonData: " + jsonData, 2) + log.debug("CastList(Items) jsonData: " + jsonData) result = json.loads(jsonData) people = result.get("People") @@ -1197,14 +1176,14 @@ def getCastList(pluginName, handle, params): xbmcplugin.endOfDirectory(handle, cacheToDisc=False) def showSetViews(): - printDebug("showSetViews Called") + log.info("showSetViews Called") defaultViews = DefaultViews.DefaultViews("DefaultViews.xml", __cwd__, "default", "720p") defaultViews.doModal() del defaultViews def getWigetContent(pluginName, handle, params): - printDebug("getWigetContent Called" + str(params)) + log.info("getWigetContent Called" + str(params)) port = __settings__.getSetting('port') host = __settings__.getSetting('ipaddress') @@ -1215,7 +1194,7 @@ def getWigetContent(pluginName, handle, params): parentId = params.get("ParentId") if(type == None): - printDebug("getWigetContent No Type") + log.error("getWigetContent No Type") return userid = downloadUtils.getUserId() @@ -1247,11 +1226,11 @@ def getWigetContent(pluginName, handle, params): "&IsMissing=False" "&format=json") - printDebug("WIDGET_DATE_URL: " + itemsUrl, 2) + log.debug("WIDGET_DATE_URL: " + itemsUrl) # get the recent items jsonData = downloadUtils.downloadUrl(itemsUrl, suppress=False, popup=1 ) - printDebug("Recent(Items) jsonData: " + jsonData, 2) + log.debug("Recent(Items) jsonData: " + jsonData) result = json.loads(jsonData) result = result.get("Items") @@ -1262,7 +1241,7 @@ def getWigetContent(pluginName, handle, params): listItems = [] for item in result: item_id = item.get("Id") - #xbmc.log(str(item)) + image = "" if item.get("Type") == "Episode": ''' @@ -1297,7 +1276,7 @@ def getWigetContent(pluginName, handle, params): name = item.get("Name") episodeDetails = "" - printDebug("WIDGET_DATE_NAME: " + name, 2) + log.debug("WIDGET_DATE_NAME: " + name) if(item.get("Type") == "Episode" and item.get("SeriesName") != None): @@ -1358,7 +1337,7 @@ def getWigetContent(pluginName, handle, params): xbmcplugin.endOfDirectory(handle, cacheToDisc=False) def showParentContent(pluginName, handle, params): - printDebug("showParentContent Called" + str(params), 2) + log.info("showParentContent Called: " + str(params)) port = __settings__.getSetting('port') host = __settings__.getSetting('ipaddress') @@ -1379,7 +1358,7 @@ def showParentContent(pluginName, handle, params): "&Fields=" + detailsString + "&format=json") - printDebug("showParentContent Content Url : " + str(contentUrl), 2) + log.info("showParentContent Content Url : " + str(contentUrl)) getContent(contentUrl, handle) @@ -1391,61 +1370,61 @@ def checkService(): timeStamp = xbmcgui.Window(10000).getProperty("EmbyCon_Service_Timestamp") loops = loops + 1 if(loops == 40): - printDebug("EmbyCon Service Not Running, no time stamp, exiting", 0) + log.error("EmbyCon Service Not Running, no time stamp, exiting") xbmcgui.Dialog().ok(__language__(30135), __language__(30136), __language__(30137)) sys.exit() xbmc.sleep(200) - printDebug ("EmbyCon Service Timestamp: " + timeStamp) - printDebug ("EmbyCon Current Timestamp: " + str(int(time.time()))) + log.info("EmbyCon Service Timestamp: " + timeStamp) + log.info("EmbyCon Current Timestamp: " + str(int(time.time()))) if((int(timeStamp) + 240) < int(time.time())): - printDebug("EmbyCon Service Not Running, time stamp to old, exiting", 0) + log.error("EmbyCon Service Not Running, time stamp to old, exiting") xbmcgui.Dialog().ok(__language__(30135), __language__(30136), __language__(30137)) sys.exit() def checkServer(force=0): - printDebug ("EmbyCon checkServer Called") + log.info("EmbyCon checkServer Called") port = __settings__.getSetting('port') host = __settings__.getSetting('ipaddress') if(force == 0 and len(host) != 0 and host != ""): - printDebug ("EmbyCon server already set") + log.info("EmbyCon server already set") return serverInfo = getServerDetails() if(len(serverInfo) == 0): - printDebug ("EmbyCon getServerDetails failed") + log.info("EmbyCon getServerDetails failed") return index = serverInfo.find(":") if(index <= 0): - printDebug ("EmbyCon getServerDetails data not correct : " + serverInfo) + log.error("EmbyCon getServerDetails data not correct : " + serverInfo) return server_address = serverInfo[:index] server_port = serverInfo[index+1:] - printDebug ("EmbyCon detected server info " + server_address + " : " + server_port) + log.info("EmbyCon detected server info " + server_address + " : " + server_port) xbmcgui.Dialog().ok(__language__(30167), __language__(30168), __language__(30169) + server_address, __language__(30030) + server_port) # get a list of users - printDebug ("Getting user list") + log.info("Getting user list") jsonData = None try: jsonData = downloadUtils.downloadUrl(server_address + ":" + server_port + "/mediabrowser/Users/Public?format=json", authenticate=False) except Exception, msg: error = "Get User unable to connect to " + server_address + ":" + server_port + " : " + str(msg) - xbmc.log (error) + log.error(error) return "" if(jsonData == False): return - printDebug("jsonData : " + str(jsonData), level=1) + log.debug("jsonData : " + str(jsonData)) result = json.loads(jsonData) names = [] @@ -1460,13 +1439,13 @@ def checkServer(force=0): name = name + " (Secure)" names.append(name) - printDebug ("User List : " + str(names)) - printDebug ("User List : " + str(userList)) + log.info("User List : " + str(names)) + log.info("User List : " + str(userList)) return_value = xbmcgui.Dialog().select(__language__(30200), names) if(return_value > -1): selected_user = userList[return_value] - printDebug("Setting Selected User : " + selected_user) + log.info("Setting Selected User : " + selected_user) if __settings__.getSetting("port") != server_port: __settings__.setSetting("port", server_port) if __settings__.getSetting("ipaddress") != server_address: diff --git a/resources/lib/loghandler.py b/resources/lib/loghandler.py new file mode 100644 index 0000000..6a2c5bb --- /dev/null +++ b/resources/lib/loghandler.py @@ -0,0 +1,71 @@ +# -*- coding: utf-8 -*- + +import logging +import xbmc + +def config(level): + + logger = logging.getLogger('EmbyCon') + handler = LogHandler(level) + logger.addHandler(handler) + logger.setLevel(logging.DEBUG) + +class LogHandler(logging.StreamHandler): + + cutoff_level = 0 + + def __init__(self, level): + + self.cutoff_level = level + xbmc.log("EmbyCon -> Setting Log Level: " + str(self.cutoff_level)) + logging.StreamHandler.__init__(self) + self.setFormatter(MyFormatter()) + + def emit(self, record): + + if self._get_log_level(record.levelno, self.cutoff_level): + try: + xbmc.log(self.format(record), level=xbmc.LOGNOTICE) + except UnicodeEncodeError: + xbmc.log(self.format(record).encode('utf-8'), level=xbmc.LOGNOTICE) + + @classmethod + def _get_log_level(cls, level, cutoff_level): + + levels = { + logging.ERROR: 0, + logging.WARNING: 1, + logging.INFO: 1, + logging.DEBUG: 2 + } + try: + log_level = int(cutoff_level) + except ValueError as e: + xbmc.log("Error setting log level: " + str(cutoff_level)) + log_level = 0 + + return log_level >= levels[level] + +class MyFormatter(logging.Formatter): + + def __init__(self, fmt="%(name)s -> %(message)s"): + + logging.Formatter.__init__(self, fmt) + + def format(self, record): + + # Save the original format configured by the user + # when the logger formatter was instantiated + format_orig = self._fmt + + # Replace the original format with one customized by logging level + if record.levelno in (logging.DEBUG, logging.ERROR): + self._fmt = '%(name)s -> %(levelname)s: %(message)s' + + # Call the original formatter class to do the grunt work + result = logging.Formatter.format(self, record) + + # Restore the original format configured by the user + self._fmt = format_orig + + return result