diff --git a/addon.xml b/addon.xml index 70cb52b..9bcadd0 100644 --- a/addon.xml +++ b/addon.xml @@ -1,7 +1,7 @@ diff --git a/resources/lib/action_menu.py b/resources/lib/action_menu.py index 3521e44..96f099a 100644 --- a/resources/lib/action_menu.py +++ b/resources/lib/action_menu.py @@ -35,7 +35,7 @@ class ActionMenu(xbmcgui.WindowXMLDialog): def onClick(self, controlID): if (controlID == 3000): self.selected_action = self.listControl.getSelectedItem() - log.debug("ActionMenu: Selected Item:" + str(self.selected_action)) + log.debug("ActionMenu: Selected Item: {0}", self.selected_action) self.close() def setActionItems(self, action_items): diff --git a/resources/lib/clientinfo.py b/resources/lib/clientinfo.py index 22e536d..bf5ae99 100644 --- a/resources/lib/clientinfo.py +++ b/resources/lib/clientinfo.py @@ -21,20 +21,20 @@ class ClientInformation(): return client_id emby_guid_path = xbmc.translatePath("special://temp/embycon_guid").decode('utf-8') - log.debug("emby_guid_path: " + emby_guid_path) + log.debug("emby_guid_path: {0}", emby_guid_path) guid = xbmcvfs.File(emby_guid_path) client_id = guid.read() guid.close() if not client_id: client_id = str("%012X" % uuid4()) - log.debug("Generating a new guid: " + client_id) + log.debug("Generating a new guid: {0}", client_id) guid = xbmcvfs.File(emby_guid_path, 'w') guid.write(client_id) guid.close() - log.debug("emby_client_id (NEW): " + client_id) + log.debug("emby_client_id (NEW): {0}", client_id) else: - log.debug("emby_client_id: " + client_id) + log.debug("emby_client_id: {0}", client_id) WINDOW.setProperty("client_id", client_id) return client_id diff --git a/resources/lib/datamanager.py b/resources/lib/datamanager.py index 9fa9a2b..d66d87c 100644 --- a/resources/lib/datamanager.py +++ b/resources/lib/datamanager.py @@ -1,19 +1,10 @@ # Gnu General Public License - see LICENSE.TXT -import hashlib -import os -import threading import json -import encodings from collections import defaultdict -import xbmcaddon -import xbmc - from downloadutils import DownloadUtils from simple_logging import SimpleLogging -from utils import getChecksum -from kodi_utils import HomeWindow log = SimpleLogging(__name__) diff --git a/resources/lib/downloadutils.py b/resources/lib/downloadutils.py index 211882e..f9a5536 100644 --- a/resources/lib/downloadutils.py +++ b/resources/lib/downloadutils.py @@ -37,7 +37,7 @@ class DownloadUtils(): # if user entered a full path i.e. http://some_host:port if host.lower().strip().startswith("http://") or host.lower().strip().startswith("https://"): - log.debug("Extracting host info from url: " + host) + log.debug("Extracting host info from url: {0}", host) url_bits = urlparse(host.strip()) if url_bits.hostname is not None and len(url_bits.hostname) > 0: host = url_bits.hostname @@ -82,14 +82,14 @@ class DownloadUtils(): BGTags = data["BackdropImageTags"] if BGTags is not None and len(BGTags) > index: imageTag = BGTags[index] - log.debug("Background Image Tag:" + imageTag) + log.debug("Background Image Tag: {0}", imageTag) elif parent is False: image_tags = data["ImageTags"] if image_tags is not None: image_tag_type = image_tags[art_type] if image_tag_type is not None: imageTag = image_tag_type - log.debug("Image Tag:" + imageTag) + log.debug("Image Tag: {0}", imageTag) elif parent is True: if (item_type == "Episode" or item_type == "Season") and art_type == 'Primary': tagName = 'SeriesPrimaryImageTag' @@ -102,17 +102,17 @@ class DownloadUtils(): if parent_image_id is not None and parent_image_tag is not None: id = parent_image_id imageTag = parent_image_tag - log.debug("Parent Image Tag:" + imageTag) + log.debug("Parent Image Tag: {0}", imageTag) if (imageTag == "" or imageTag == None) and (art_type != 'Banner'): # ParentTag not passed for Banner - log.debug("No Image Tag for request:" + art_type + " item:" + item_type + " parent:" + str(parent)) + log.debug("No Image Tag for request:{0} item:{1} parent:{2}", art_type, item_type, parent) return "" query = "" artwork = "%s/emby/Items/%s/Images/%s/%s?MaxWidth=%s&MaxHeight=%s&Format=original&Tag=%s%s" % (server, id, art_type, index, width, height, imageTag, query) - log.debug("getArtwork : " + artwork) + log.debug("getArtwork: {0}", artwork) ''' # do not return non-existing images @@ -141,7 +141,7 @@ class DownloadUtils(): userid = WINDOW.getProperty("userid") if (userid != None and userid != ""): - log.debug("EmbyCon DownloadUtils -> Returning saved UserID : " + userid) + log.debug("EmbyCon DownloadUtils -> Returning saved UserID: {0}", userid) return userid settings = xbmcaddon.Addon('plugin.video.embycon') @@ -149,37 +149,36 @@ class DownloadUtils(): if not userName: return "" - log.debug("Looking for user name: " + userName) + log.debug("Looking for user name: {0}", userName) jsonData = None try: jsonData = self.downloadUrl("{server}/emby/Users/Public?format=json", suppress=True, authenticate=False) except Exception, msg: - error = "Get User unable to connect: " + str(msg) - log.error(error) + log.error("Get User unable to connect: {0}", msg) return "" - log.debug("GETUSER_JSONDATA_01:" + str(jsonData)) + log.debug("GETUSER_JSONDATA_01: {0}", jsonData) result = [] try: result = json.loads(jsonData) except Exception, e: - log.debug("jsonload : " + str(e) + " (" + jsonData + ")") + log.debug("Could not load user data: {0}", e) return "" if result is None: return "" - log.debug("GETUSER_JSONDATA_02:" + str(result)) + log.debug("GETUSER_JSONDATA_02: {0}", result) userid = "" secure = False for user in result: if (user.get("Name") == userName): userid = user.get("Id") - log.debug("Username Found: " + user.get("Name")) + log.debug("Username Found: {0}", user.get("Name")) if (user.get("HasPassword") == True): secure = True log.debug("Username Is Secure (HasPassword=True)") @@ -200,7 +199,7 @@ class DownloadUtils(): i18n('username_not_found'), icon="special://home/addons/plugin.video.embycon/icon.png") - log.debug("userid : " + userid) + log.debug("userid: {0}", userid) WINDOW.setProperty("userid", userid) @@ -212,7 +211,7 @@ class DownloadUtils(): token = WINDOW.getProperty("AccessToken") if token is not None and token != "": - log.debug("EmbyCon DownloadUtils -> Returning saved AccessToken : " + token) + log.debug("EmbyCon DownloadUtils -> Returning saved AccessToken: {0}", token) return token settings = xbmcaddon.Addon('plugin.video.embycon') @@ -239,7 +238,7 @@ class DownloadUtils(): pass if accessToken is not None: - log.debug("User Authenticated : " + accessToken) + log.debug("User Authenticated: {0}", accessToken) WINDOW.setProperty("AccessToken", accessToken) WINDOW.setProperty("userid", userid) return accessToken @@ -278,7 +277,7 @@ class DownloadUtils(): if (authToken != ""): headers["X-MediaBrowser-Token"] = authToken - log.debug("EmbyCon Authentication Header : " + str(headers)) + log.debug("EmbyCon Authentication Header: {0}", headers) return headers def downloadUrl(self, url, suppress=False, postBody=None, method="GET", authenticate=True, headers=None): @@ -290,7 +289,7 @@ class DownloadUtils(): if settings.getSetting("suppressErrors") == "true": suppress = True - log.debug(url) + log.debug("Before: {0}", url) if url.find("{server}") != -1: server = self.getServer() if server is None: @@ -318,7 +317,7 @@ class DownloadUtils(): url = url.replace("{IsUnplayed,}", "IsUnplayed,") elif url.find("{,IsUnplayed,}") != -1: url = url.replace("{,IsUnplayed,}", ",IsUnplayed,") - log.debug(url) + log.debug("After: {0}", url) try: if url.startswith('http'): @@ -331,9 +330,9 @@ class DownloadUtils(): server = url.split('/')[serversplit] urlPath = "/" + "/".join(url.split('/')[urlsplit:]) - log.debug("DOWNLOAD_URL = " + url) - log.debug("server = " + str(server)) - log.debug("urlPath = " + str(urlPath)) + log.debug("DOWNLOAD_URL: {0}", url) + log.debug("server: {0}", server) + log.debug("urlPath: {0}", urlPath) # check the server details tokens = server.split(':') @@ -356,7 +355,7 @@ class DownloadUtils(): conn = httplib.HTTPConnection(server, timeout=40) head = self.getAuthHeader(authenticate) - log.debug("HEADERS : " + str(head)) + log.debug("HEADERS: {0}", head) if (postBody != None): if isinstance(postBody, dict): @@ -366,20 +365,20 @@ class DownloadUtils(): content_type = "application/x-www-form-urlencoded" head["Content-Type"] = content_type - log.debug("Content-Type : " + content_type) + log.debug("Content-Type: {0}", content_type) - log.debug("POST DATA : " + postBody) + log.debug("POST DATA: {0}", postBody) conn.request(method=method, url=urlPath, body=postBody, headers=head) else: conn.request(method=method, url=urlPath, headers=head) data = conn.getresponse() - log.debug("GET URL HEADERS : " + str(data.getheaders())) + log.debug("GET URL HEADERS: {0}", data.getheaders()) if int(data.status) == 200: retData = data.read() contentType = data.getheader('content-encoding') - log.debug("Data Len Before : " + str(len(retData))) + log.debug("Data Len Before: {0}", len(retData)) if (contentType == "gzip"): retData = StringIO.StringIO(retData) gzipper = gzip.GzipFile(fileobj=retData) @@ -388,24 +387,21 @@ class DownloadUtils(): return_data = retData if headers is not None and isinstance(headers, dict): headers.update(data.getheaders()) - log.debug("Data Len After : " + str(len(return_data))) + log.debug("Data Len After: {0}", len(return_data)) log.debug("====== 200 returned =======") - log.debug("Content-Type : " + str(contentType)) - log.debug(return_data) + log.debug("Content-Type: {0}", contentType) + log.debug("{0}", return_data) log.debug("====== 200 finished ======") elif int(data.status) >= 400: - error = "HTTP response error: " + str(data.status) + " " + str(data.reason) - log.error(error) + log.error("HTTP response error: {0} {1}", data.status, data.reason) if suppress is False: xbmcgui.Dialog().notification(i18n("connection_error"), i18n('url_error_') % str(data.reason), icon="special://home/addons/plugin.video.embycon/icon.png") - log.error(error) except Exception, msg: - error = "Unable to connect to " + str(server) + " : " + str(msg) - log.error(error) + log.error("Unable to connect to {0} : {1}", server, msg) if suppress is False: xbmcgui.Dialog().notification(i18n("connection_error"), str(msg), @@ -413,7 +409,7 @@ class DownloadUtils(): finally: try: - log.debug("Closing HTTP connection: " + str(conn)) + log.debug("Closing HTTP connection: {0}", conn) conn.close() except: pass diff --git a/resources/lib/error.py b/resources/lib/error.py index 6f777eb..207d0eb 100644 --- a/resources/lib/error.py +++ b/resources/lib/error.py @@ -28,7 +28,7 @@ def catch_except(errors=(Exception, ), default_value=False): try: submit_error_data() except Exception as error: - log.debug("Sending Error Data Failed: " + str(error)) + log.debug("Sending Error Data Failed: {0}", error) raise return default_value return wrapper @@ -56,7 +56,7 @@ def submit_error_data(): data["report_error"] = str(error) post_data = json.dumps(data) - log.debug("ERROR_DATA: " + post_data) + log.debug("ERROR_DATA: {0}", post_data) server = "allthedata.pythonanywhere.com" url_path = "/submit" @@ -65,7 +65,7 @@ def submit_error_data(): head["Content-Type"] = "application/json" conn.request(method="POST", url=url_path, body=post_data, headers=head) data = conn.getresponse() - log.debug("Submit Responce Code: " + str(data.status)) + log.debug("Submit Responce Code: {0}", data.status) def format_exception(): @@ -126,7 +126,7 @@ def format_exception(): # log.error(str(fileStackTrace)) except Exception as e: fileStackTrace = None - log.error(e) + log.error("{0}", e) errorType = "NA" errorFile = "NA" diff --git a/resources/lib/functions.py b/resources/lib/functions.py index bb88490..4214711 100644 --- a/resources/lib/functions.py +++ b/resources/lib/functions.py @@ -59,11 +59,11 @@ def mainEntryPoint(): pr.enable() ADDON_VERSION = ClientInformation().getVersion() - log.debug("Running Python: " + str(sys.version_info)) - log.debug("Running EmbyCon: " + str(ADDON_VERSION)) - log.debug("Kodi BuildVersion: " + xbmc.getInfoLabel("System.BuildVersion")) - log.debug("Kodi Version: " + str(kodi_version)) - log.debug("Script argument data: " + str(sys.argv)) + log.debug("Running Python: {0}", sys.version_info) + log.debug("Running EmbyCon: {0}", ADDON_VERSION) + log.debug("Kodi BuildVersion: {0}", xbmc.getInfoLabel("System.BuildVersion")) + log.debug("Kodi Version: {0}", kodi_version) + log.debug("Script argument data: {0}", sys.argv) try: params = get_params(sys.argv[2]) @@ -74,7 +74,7 @@ def mainEntryPoint(): if (len(params) == 0): windowParams = home_window.getProperty("Params") - log.debug("windowParams : " + windowParams) + log.debug("windowParams: {0}", windowParams) # home_window.clearProperty("Params") if (windowParams): try: @@ -82,7 +82,7 @@ def mainEntryPoint(): except: params = {} - log.debug("Script params = " + str(params)) + log.debug("Script params: {0}", params) param_url = params.get('url', None) @@ -173,8 +173,8 @@ def mainEntryPoint(): trakttokodi.entry_point(params) else: checkServer(notify=False) - log.debug("EmbyCon -> Mode: " + str(mode)) - log.debug("EmbyCon -> URL: " + str(param_url)) + log.debug("EmbyCon -> Mode: {0}", mode) + log.debug("EmbyCon -> URL: {0}", param_url) if mode == "GET_CONTENT": getContent(param_url, params) @@ -204,7 +204,7 @@ def mainEntryPoint(): def markWatched(item_id): - log.debug("Mark Item Watched : " + item_id) + log.debug("Mark Item Watched: {0}", item_id) url = "{server}/emby/Users/{userid}/PlayedItems/" + item_id downloadUtils.downloadUrl(url, postBody="", method="POST") home_window = HomeWindow() @@ -214,7 +214,7 @@ def markWatched(item_id): def markUnwatched(item_id): - log.debug("Mark Item UnWatched : " + item_id) + log.debug("Mark Item UnWatched: {0}", item_id) url = "{server}/emby/Users/{userid}/PlayedItems/" + item_id downloadUtils.downloadUrl(url, method="DELETE") home_window = HomeWindow() @@ -224,7 +224,7 @@ def markUnwatched(item_id): def markFavorite(item_id): - log.debug("Add item to favourites : " + item_id) + log.debug("Add item to favourites: {0}", item_id) url = "{server}/emby/Users/{userid}/FavoriteItems/" + item_id downloadUtils.downloadUrl(url, postBody="", method="POST") home_window = HomeWindow() @@ -234,7 +234,7 @@ def markFavorite(item_id): def unmarkFavorite(item_id): - log.debug("Remove item from favourites : " + item_id) + log.debug("Remove item from favourites: {0}", item_id) url = "{server}/emby/Users/{userid}/FavoriteItems/" + item_id downloadUtils.downloadUrl(url, method="DELETE") home_window = HomeWindow() @@ -246,7 +246,7 @@ def unmarkFavorite(item_id): def delete(item_id): return_value = xbmcgui.Dialog().yesno(i18n('confirm_file_delete'), i18n('file_delete_confirm')) if return_value: - log.debug('Deleting Item : ' + item_id) + log.debug('Deleting Item: {0}', item_id) url = '{server}/emby/Items/' + item_id progress = xbmcgui.DialogProgress() progress.create(i18n('deleting'), i18n('waiting_server_delete')) @@ -258,7 +258,7 @@ def delete(item_id): def get_params(paramstring): - log.debug("Parameter string: " + paramstring) + log.debug("Parameter string: {0}", paramstring) param = {} if len(paramstring) >= 2: params = paramstring @@ -280,12 +280,12 @@ def get_params(paramstring): elif (len(splitparams)) == 3: param[splitparams[0]] = splitparams[1] + "=" + splitparams[2] - log.debug("EmbyCon -> Detected parameters: " + str(param)) + log.debug("EmbyCon -> Detected parameters: {0}", param) return param def setSort(pluginhandle, viewType): - log.debug("SETTING_SORT for media type: " + str(viewType)) + log.debug("SETTING_SORT for media type: {0}", viewType) if viewType == "BoxSets": xbmcplugin.addSortMethod(pluginhandle, xbmcplugin.SORT_METHOD_VIDEO_YEAR) xbmcplugin.addSortMethod(pluginhandle, xbmcplugin.SORT_METHOD_VIDEO_SORT_TITLE_IGNORE_THE) @@ -307,8 +307,8 @@ def getContent(url, params): if not media_type: xbmcgui.Dialog().ok(i18n('error'), i18n('no_media_type')) - log.debug("URL: " + str(url)) - log.debug("MediaType: " + str(media_type)) + log.debug("URL: {0}", url) + log.debug("MediaType: {0}", media_type) pluginhandle = int(sys.argv[1]) settings = xbmcaddon.Addon(id='plugin.video.embycon') @@ -330,7 +330,7 @@ def getContent(url, params): elif media_type == "season" or media_type == "episodes": viewType = "Episodes" xbmcplugin.setContent(pluginhandle, 'episodes') - log.debug("ViewType: " + viewType) + log.debug("ViewType: {0}", viewType) setSort(pluginhandle, viewType) @@ -512,7 +512,7 @@ def processDirectory(results, progress, params): return dirItems def showMenu(params): - log.debug("showMenu(): " + str(params)) + log.debug("showMenu(): {0}", params) action_items = [] li = xbmcgui.ListItem("Play") @@ -540,14 +540,14 @@ def showMenu(params): selected_action = "" if selected_action_item is not None: selected_action = selected_action_item.getProperty('menu_id') - log.debug("Menu Action Selected: " + str(selected_action_item)) + log.debug("Menu Action Selected: {0}", selected_action_item) del action_menu if selected_action == "play": log.debug("Play Item") #list_item = populate_listitem(params["item_id"]) #result = xbmcgui.Dialog().info(list_item) - #log.debug("xbmcgui.Dialog().info: " + str(result)) + #log.debug("xbmcgui.Dialog().info: {0}", result) PLAY(params) elif selected_action == "transcode": params['force_transcode'] = 'true' @@ -564,12 +564,12 @@ def showMenu(params): def populate_listitem(item_id): - log.debug("populate_listitem: " + item_id) + log.debug("populate_listitem: {0}", item_id) url = "{server}/emby/Users/{userid}/Items/" + item_id + "?format=json" jsonData = downloadUtils.downloadUrl(url) result = json.loads(jsonData) - log.debug("populate_listitem item info: " + str(result)) + log.debug("populate_listitem item info: {0}", result) ''' server = downloadUtils.getServer() @@ -584,7 +584,7 @@ def populate_listitem(item_id): details, extraData = extract_item_info(result,gui_options ) u, list_item, folder = add_gui_item(result["Id"], details, extraData, {}, folder=False) - log.debug("list_item path: " + u) + log.debug("list_item path: {0}", u) #list_item.setProperty('IsPlayable', 'false') #list_item.setPath(u) @@ -618,7 +618,7 @@ def populate_listitem(item_id): def showContent(pluginName, handle, params): - log.debug("showContent Called: " + str(params)) + log.debug("showContent Called: {0}", params) item_type = params.get("item_type") @@ -632,11 +632,11 @@ def showContent(pluginName, handle, params): "&IsMissing=False" "&IncludeItemTypes=" + item_type) - log.debug("showContent Content Url : " + str(contentUrl)) + log.debug("showContent Content Url: {0}", contentUrl) getContent(contentUrl, params) def showParentContent(pluginName, handle, params): - log.debug("showParentContent Called: " + str(params)) + log.debug("showParentContent Called: {0}", params) settings = xbmcaddon.Addon(id='plugin.video.embycon') @@ -651,7 +651,7 @@ def showParentContent(pluginName, handle, params): "&Fields=" + detailsString + "&format=json") - log.debug("showParentContent Content Url : " + str(contentUrl)) + log.debug("showParentContent Content Url: {0}", contentUrl) getContent(contentUrl, params) @@ -683,7 +683,7 @@ def searchResults(params): home_window.setProperty("last_search", user_input) - log.debug('searchResults Called: ' + str(params)) + log.debug('searchResults Called: {0}', params) handle = int(sys.argv[1]) query = user_input @@ -732,7 +732,7 @@ def searchResults(params): progress.update(0, i18n('retrieving_data')) result = dataManager.GetContent(content_url) - log.debug('SearchHints jsonData: ' + str(result)) + log.debug('SearchHints jsonData: {0}', result) results = result.get('SearchHints') if results is None: @@ -740,13 +740,13 @@ def searchResults(params): item_count = 1 total_results = int(result.get('TotalRecordCount', 0)) - log.debug('SEARCH_TOTAL_RESULTS: ' + str(total_results)) + log.debug('SEARCH_TOTAL_RESULTS: {0}', total_results) list_items = [] for item in results: item_id = item.get('ItemId') name = title = item.get('Name') - log.debug('SEARCH_RESULT_NAME: ' + name) + log.debug('SEARCH_RESULT_NAME: {0}', name) if progress is not None: percent_complete = (float(item_count) / float(total_results)) * 100 @@ -805,7 +805,7 @@ def searchResults(params): list_item = xbmcgui.ListItem(label=name, iconImage=art['thumb']) info = {'title': title, 'tvshowtitle': tvshowtitle, 'mediatype': media_type} - log.debug('SEARCH_RESULT_ART: ' + str(art)) + log.debug('SEARCH_RESULT_ART: {0}', art) list_item.setProperty('fanart_image', art['fanart']) list_item.setProperty('discart', art['discart']) list_item.setArt(art) @@ -843,7 +843,7 @@ def searchResults(params): info['year'] = item.get('ProductionYear', '') - log.debug('SEARCH_RESULT_INFO: ' + str(info)) + log.debug('SEARCH_RESULT_INFO: {0}', info) list_item.setInfo('Video', infoLabels=info) item_tuple = (list_item_url, list_item, is_folder) @@ -860,20 +860,20 @@ def searchResults(params): def PLAY(params): log.debug("== ENTER: PLAY ==") - log.debug("PLAY ACTION PARAMS: " + str(params)) + log.debug("PLAY ACTION PARAMS: {0}", params) item_id = params.get("item_id") auto_resume = int(params.get("auto_resume", "-1")) - log.debug("AUTO_RESUME: " + str(auto_resume)) + log.debug("AUTO_RESUME: {0}", auto_resume) forceTranscode = params.get("force_transcode", None) is not None - log.debug("FORCE_TRANSCODE: " + str(forceTranscode)) + log.debug("FORCE_TRANSCODE: {0}", forceTranscode) media_source_id = params.get("media_source_id", "") - log.debug("media_source_id: " + str(media_source_id)) + log.debug("media_source_id: {0}", media_source_id) use_default = params.get("use_default", "false") == "true" - log.debug("use_default: " + str(use_default)) + log.debug("use_default: {0}", use_default) # set the current playing item id # set all the playback info, this will be picked up by the service @@ -902,7 +902,7 @@ def playTrailer(id): jsonData = downloadUtils.downloadUrl(url) result = json.loads(jsonData) - log.debug("LocalTrailers" + str(result)) + log.debug("LocalTrailers {0}", result) trailer_list = [] for trailer in result: @@ -915,7 +915,7 @@ def playTrailer(id): url = ("{server}/emby/Users/{userid}/Items/%s?format=json&Fields=RemoteTrailers" % id) jsonData = downloadUtils.downloadUrl(url) result = json.loads(jsonData) - log.debug("RemoteTrailers" + str(result)) + log.debug("RemoteTrailers: {0}", result) remote_trailers = result.get("RemoteTrailers", []) for trailer in remote_trailers: @@ -927,7 +927,7 @@ def playTrailer(id): info["url"] = url trailer_list.append(info) - log.debug("TrailerList: " + str(trailer_list)) + log.debug("TrailerList: {0}", trailer_list) trailer_text = [] for trailer in trailer_list: @@ -938,7 +938,7 @@ def playTrailer(id): resp = dialog.select(i18n('select_trailer'), trailer_text) if resp > -1: trailer = trailer_list[resp] - log.debug("SelectedTrailer: " + str(trailer)) + log.debug("SelectedTrailer: {0}", trailer) if trailer.get("type") == "local": params = {} @@ -947,7 +947,7 @@ def playTrailer(id): elif trailer.get("type") == "remote": youtube_id = trailer.get("url").rsplit('=', 1)[1] - log.debug("YoutubeID: " + str(youtube_id)) + log.debug("YoutubeID: {0}", youtube_id) youtube_plugin = "PlayMedia(plugin://plugin.video.youtube/?action=play_video&videoid=%s)" % youtube_id xbmc.executebuiltin(youtube_plugin) diff --git a/resources/lib/item_functions.py b/resources/lib/item_functions.py index b97eb15..2dbe3f2 100644 --- a/resources/lib/item_functions.py +++ b/resources/lib/item_functions.py @@ -116,7 +116,7 @@ def extract_item_info(item, gui_options): nameInfo["SeriesName"] = "" nameInfo["SeasonIndex"] = "%02d" % item_details.season_number nameInfo["EpisodeIndex"] = "%02d" % item_details.episode_number - log.debug("FormatName : %s | %s" % (name_format, nameInfo)) + log.debug("FormatName: {0} | {1}", name_format, nameInfo) item_details.name = name_format.format(**nameInfo).strip() else: @@ -188,7 +188,7 @@ def extract_item_info(item, gui_options): elif person_type == "Writing": item_details.writer = person["Name"] elif person_type == "Actor": - log.debug("Person : %s" % person) + log.debug("Person: {0}", person) person_name = person["Name"] person_role = person["Role"] person_id = person["Id"] @@ -275,8 +275,7 @@ def add_gui_item(url, item_details, display_options, folder=True): url = url.encode('utf-8') - log.debug("Adding GuiItem for [%s]" % item_details.name) - log.debug("Passed extraData: " + str(item_details.__dict__)) + log.debug("Passed item_details: {0}", item_details.__dict__) if not item_details.name: return @@ -335,7 +334,7 @@ def add_gui_item(url, item_details, display_options, folder=True): else: list_item = xbmcgui.ListItem(listItemName, iconImage=thumbPath, thumbnailImage=thumbPath) - log.debug("Setting thumbnail as " + thumbPath) + log.debug("Setting thumbnail as: {0}", thumbPath) # calculate percentage if (cappedPercentage != 0): diff --git a/resources/lib/kodi_utils.py b/resources/lib/kodi_utils.py index 0bf3ab5..21071d4 100644 --- a/resources/lib/kodi_utils.py +++ b/resources/lib/kodi_utils.py @@ -23,17 +23,17 @@ class HomeWindow(): def getProperty(self, key): key = self.id_string % key value = self.window.getProperty(key) - # log.debug('HomeWindow: getProperty |%s| -> |%s|' % (key, value)) + # log.debug('HomeWindow: getProperty |{0}| -> |{1}|', key, value) return value def setProperty(self, key, value): key = self.id_string % key - # log.debug('HomeWindow: setProperty |%s| -> |%s|' % (key, value)) + # log.debug('HomeWindow: setProperty |{0}| -> |{1}|', key, value) self.window.setProperty(key, value) def clearProperty(self, key): key = self.id_string % key - # log.debug('HomeWindow: clearProperty |%s|' % key) + # log.debug('HomeWindow: clearProperty |{0}|', key) self.window.clearProperty(key) @@ -59,9 +59,9 @@ def getKodiVersion(): result = result.get("result") versionData = result.get("version") version = float(str(versionData.get("major")) + "." + str(versionData.get("minor"))) - log.debug("Version : " + str(version) + " - " + str(versionData)) + log.debug("Version: {0} - {1}", version, versionData) except: version = 0.0 - log.error("Version Error : RAW Version Data : " + str(result)) + log.error("Version Error : RAW Version Data: {0}", result) return version diff --git a/resources/lib/menu_functions.py b/resources/lib/menu_functions.py index c8af094..461f868 100644 --- a/resources/lib/menu_functions.py +++ b/resources/lib/menu_functions.py @@ -69,7 +69,7 @@ def showGenreList(item_type=None): url = sys.argv[0] + ("?url=" + urllib.quote(collection['path']) + "&mode=GET_CONTENT" + "&media_type=" + collection["media_type"]) - log.debug("addMenuDirectoryItem: " + collection.get('title', i18n('unknown')) + " " + str(url)) + log.debug("addMenuDirectoryItem: {0} ({1})", collection.get('title'), url) addMenuDirectoryItem(collection.get('title', i18n('unknown')), url, thumbnail=collection.get("thumbnail")) xbmcplugin.endOfDirectory(int(sys.argv[1])) @@ -115,7 +115,7 @@ def showMovieAlphaList(): for collection in collections: url = (sys.argv[0] + "?url=" + urllib.quote(collection['path']) + "&mode=GET_CONTENT&media_type=" + collection["media_type"]) - log.debug("addMenuDirectoryItem: " + collection.get('title', i18n('unknown')) + " " + str(url)) + log.debug("addMenuDirectoryItem: {0} ({1})", collection.get('title'), url) addMenuDirectoryItem(collection.get('title', i18n('unknown')), url) xbmcplugin.endOfDirectory(int(sys.argv[1])) @@ -135,7 +135,7 @@ def showYearsList(): "&Recursive=true" + "&UserId={userid}" + "&format=json") - log.debug("YEAR_LIST_DATA : %s" % jsonData) + log.debug("YEAR_LIST_DATA: {0}", jsonData) result = json.loads(jsonData) if result is not None: @@ -163,7 +163,7 @@ def showYearsList(): url = sys.argv[0] + ("?url=" + urllib.quote(collection['path']) + "&mode=GET_CONTENT" + "&media_type=" + collection["media_type"]) - log.debug("addMenuDirectoryItem: " + collection.get('title', i18n('unknown')) + " " + str(url)) + log.debug("addMenuDirectoryItem: {0} ({1})", collection.get('title'), url) addMenuDirectoryItem(collection.get('title', i18n('unknown')), url)#, thumbnail=collection.get("thumbnail")) xbmcplugin.addSortMethod(int(sys.argv[1]), xbmcplugin.SORT_METHOD_LABEL) @@ -188,7 +188,7 @@ def displaySections(): "&mode=GET_CONTENT&media_type=" + collection["media_type"]) if collection.get("name_format") is not None: url += "&name_format=" + urllib.quote(collection.get("name_format")) - log.debug("addMenuDirectoryItem: " + collection.get('title', i18n('unknown')) + " " + str(url)) + log.debug("addMenuDirectoryItem: {0} ({1})", collection.get('title'), url) addMenuDirectoryItem(collection.get('title', i18n('unknown')), url, thumbnail=collection.get("thumbnail")) addMenuDirectoryItem(i18n('movies_year'), "plugin://plugin.video.embycon/?mode=MOVIE_YEARS") @@ -230,7 +230,7 @@ def getCollections(detailsString): return [] parentid = result.get("Id") - log.debug("parentid : " + parentid) + log.debug("parentid: {0}", parentid) htmlpath = "{server}/emby/Users/{userid}/items?ParentId=" + parentid + "&Sortby=SortName&format=json" result = data_manager.GetContent(htmlpath) @@ -246,8 +246,8 @@ def getCollections(detailsString): item_name = (item.get("Name")).encode('utf-8') collection_type = item.get('CollectionType', None) - log.debug("CollectionType: " + str(collection_type)) - log.debug("Title: " + item_name) + log.debug("CollectionType: {0}", collection_type) + log.debug("Title: {0}", item_name) if collection_type in ["tvshows", "movies", "boxsets"]: collections.append({ diff --git a/resources/lib/play_utils.py b/resources/lib/play_utils.py index e9b5510..6537d06 100644 --- a/resources/lib/play_utils.py +++ b/resources/lib/play_utils.py @@ -31,7 +31,7 @@ def playFile(play_info): media_source_id = play_info.get("media_source_id", "") use_default = play_info.get("use_default", False) - log.debug("playFile id(%s) resume(%s) force_transcode(%s)" % (id, auto_resume, force_transcode)) + log.debug("playFile id({0}) resume({1}) force_transcode({2})", id, auto_resume, force_transcode) settings = xbmcaddon.Addon('plugin.video.embycon') addon_path = settings.getAddonInfo('path') @@ -42,7 +42,7 @@ def playFile(play_info): url = "{server}/emby/Users/{userid}/Items/" + id + "?format=json" data_manager = DataManager() result = data_manager.GetContent(url) - log.debug("Playfile item info: " + str(result)) + log.debug("Playfile item info: {0}", result) if result is None: log.debug("Playfile item was None, so can not play!") @@ -101,13 +101,13 @@ def playFile(play_info): resumeDialog.doModal() resume_result = resumeDialog.getResumeAction() del resumeDialog - log.debug("Resume Dialog Result: " + str(resume_result)) + log.debug("Resume Dialog Result: {0}", resume_result) # check system settings for play action # if prompt is set ask to set it to auto resume params = {"setting": "myvideos.selectaction"} setting_result = json_rpc('Settings.getSettingValue').execute(params) - log.debug("Current Setting (myvideos.selectaction): %s" % setting_result) + log.debug("Current Setting (myvideos.selectaction): {0}", setting_result) current_value = setting_result.get("result", None) if current_value is not None: current_value = current_value.get("value", -1) @@ -116,7 +116,7 @@ def playFile(play_info): if return_value: params = {"setting": "myvideos.selectaction", "value": 2} json_rpc_result = json_rpc('Settings.setSettingValue').execute(params) - log.debug("Save Setting (myvideos.selectaction): %s" % json_rpc_result) + log.debug("Save Setting (myvideos.selectaction): {0}", json_rpc_result) if resume_result == 1: seekTime = 0 @@ -127,7 +127,7 @@ def playFile(play_info): playback_type = "0" playurl = None play_session_id = id_generator() - log.debug("play_session_id: %s" % play_session_id) + log.debug("play_session_id: {0}", play_session_id) # check if strm file, path will contain contain strm contents if selected_media_source.get('Container') == 'strm': @@ -138,7 +138,7 @@ def playFile(play_info): if not playurl: playurl, playback_type = PlayUtils().getPlayUrl(id, selected_media_source, force_transcode, play_session_id) - log.debug("Play URL: " + str(playurl) + " ListItem Properties: " + str(listitem_props)) + log.debug("Play URL: {0} ListItem Properties: {1}", playurl, listitem_props) playback_type_string = "DirectPlay" if playback_type == "2": @@ -174,7 +174,7 @@ def playFile(play_info): if playback_type == "2": # if transcoding then prompt for audio and subtitle playurl = audioSubsPref(playurl, list_item, selected_media_source, id, use_default) - log.debug("New playurl for transcoding : " + playurl) + log.debug("New playurl for transcoding: {0}", playurl) elif playback_type == "1": # for direct stream add any streamable subtitles externalSubs(selected_media_source, list_item, id) @@ -336,7 +336,7 @@ def audioSubsPref(url, list_item, media_source, item_id, use_default): if selectSubsIndex in downloadableStreams: url = [("%s/Videos/%s/%s/Subtitles/%s/Stream.srt" % (downloadUtils.getServer(), item_id, item_id, selectSubsIndex))] - log.debug("Streaming subtitles url: %s %s" % (selectSubsIndex, url)) + log.debug("Streaming subtitles url: {0} {1}", selectSubsIndex, url) list_item.setSubtitles(url) else: # Burn subtitles diff --git a/resources/lib/server_detect.py b/resources/lib/server_detect.py index 9aa2258..e0ee992 100644 --- a/resources/lib/server_detect.py +++ b/resources/lib/server_detect.py @@ -35,8 +35,8 @@ def getServerDetails(): sock.setsockopt(socket.SOL_IP, socket.IP_MULTICAST_LOOP, 1) sock.setsockopt(socket.IPPROTO_IP, socket.SO_REUSEADDR, 1) - log.debug("MutliGroup : " + str(MULTI_GROUP)) - log.debug("Sending UDP Data : " + MESSAGE) + log.debug("MutliGroup: {0}", MULTI_GROUP) + log.debug("Sending UDP Data: {0}", MESSAGE) sock.sendto(MESSAGE, MULTI_GROUP) servers = [] @@ -46,10 +46,10 @@ def getServerDetails(): data, addr = sock.recvfrom(1024) # buffer size servers.append(json.loads(data)) except Exception as e: - log.error("Read UPD responce: %s" % e) + log.error("Read UPD responce: {0}", e) # break - log.debug("Found Servers: %s" % servers) + log.debug("Found Servers: {0}", servers) return servers @@ -83,14 +83,14 @@ def checkServer(force=False, change_user=False, notify=False): return serverUrl = serverInfo[return_index]["Address"] - log.debug("Selected server: " + serverUrl) + log.debug("Selected server: {0}", serverUrl) # parse the url url_bits = urlparse(serverUrl) server_address = url_bits.hostname server_port = str(url_bits.port) server_protocol = url_bits.scheme - log.debug("Detected server info " + server_protocol + " - " + server_address + " - " + server_port) + log.debug("Detected server info {0} - {1} - {2}", server_protocol, server_address, server_port) # save the server info settings.setSetting("port", server_port) @@ -114,7 +114,7 @@ def checkServer(force=False, change_user=False, notify=False): log.debug("Getting user list") jsonData = downloadUtils.downloadUrl(serverUrl + "/emby/Users/Public?format=json", authenticate=False) - log.debug("jsonData : " + str(jsonData)) + log.debug("jsonData: {0}", jsonData) result = json.loads(jsonData) if result is None: xbmcgui.Dialog().ok(i18n('error'), @@ -145,13 +145,13 @@ def checkServer(force=False, change_user=False, notify=False): names.insert(0, i18n('username_userinput')) user_list.insert(0, '') secured.insert(0, True) - log.debug("User List : " + str(names)) - log.debug("User List : " + str(user_list)) + log.debug("User List: {0}", names) + log.debug("User List: {0}", user_list) return_value = xbmcgui.Dialog().select(i18n('select_user'), names) if (return_value > -1): - log.debug("Selected User Index : " + str(return_value)) + log.debug("Selected User Index: {0}", return_value) if return_value == 0: kb = xbmc.Keyboard() kb.setHeading(i18n('username:')) @@ -163,11 +163,11 @@ def checkServer(force=False, change_user=False, notify=False): else: selected_user = user_list[return_value] - log.debug("Selected User Name : " + str(selected_user)) + log.debug("Selected User Name: {0}", selected_user) if selected_user: # we have a user so save it - log.debug("Saving Username : " + selected_user) + log.debug("Saving Username: {0}", selected_user) settings.setSetting("username", selected_user) if secured[return_value] is True: kb = xbmc.Keyboard() @@ -175,7 +175,7 @@ def checkServer(force=False, change_user=False, notify=False): kb.setHiddenInput(True) kb.doModal() if kb.isConfirmed(): - log.debug("Saving Password for Username : " + selected_user) + log.debug("Saving Password for Username: {0}", selected_user) settings.setSetting('password', kb.getText()) else: settings.setSetting('password', '') diff --git a/resources/lib/server_sessions.py b/resources/lib/server_sessions.py index d4a4d3f..feb9efd 100644 --- a/resources/lib/server_sessions.py +++ b/resources/lib/server_sessions.py @@ -35,27 +35,27 @@ def showServerSessions(): if play_state is not None: runtime = 0 media_id = play_state.get("MediaSourceId", None) - log.debug("Media ID " + str(media_id)) + log.debug("Media ID: {0}", media_id) if media_id is not None: url = "{server}/emby/Users/{userid}/Items/" + media_id + "?format=json" jsonData = downloadUtils.downloadUrl(url) media_info = json.loads(jsonData) - log.debug("Media Info " + str(media_info)) + log.debug("Media Info: {0}", media_info) runtime = media_info.get("RunTimeTicks", 0) - log.debug("Media Runtime " + str(runtime)) + log.debug("Media Runtime: {0}", runtime) position_ticks = play_state.get("PositionTicks", 0) - log.debug("Media PositionTicks " + str(position_ticks)) + log.debug("Media PositionTicks: {0}", position_ticks) if position_ticks > 0 and runtime > 0: percenatge_played = (position_ticks / float(runtime)) * 100.0 percenatge_played = int(percenatge_played) now_playing = session.get("NowPlayingItem", None) - log.debug("NOW_PLAYING: " + str(now_playing)) + log.debug("NOW_PLAYING: {0}", now_playing) if now_playing is not None: session_info += " (" + now_playing.get("Name", "na") + " " + str(percenatge_played) + "%)" - log.debug(session_info) + log.debug("session_info: {0}", session_info) list_item = xbmcgui.ListItem(label=session_info) item_tuple = ("", list_item, False) list_items.append(item_tuple) diff --git a/resources/lib/simple_logging.py b/resources/lib/simple_logging.py index 63ce6ac..c5c2a83 100644 --- a/resources/lib/simple_logging.py +++ b/resources/lib/simple_logging.py @@ -19,23 +19,22 @@ class SimpleLogging(): current_value = setting_result.get("result", None) if current_value is not None: self.enable_logging = current_value.get("value", False) - #xbmc.log("LOGGING_ENABLED %s: %s" % (self.name, str(self.enable_logging)), level=xbmc.LOGDEBUG) + xbmc.log("LOGGING_ENABLED %s : %s" % (self.name, str(self.enable_logging)), level=xbmc.LOGDEBUG) def __str__(self): return "LoggingEnabled: " + str(self.enable_logging) - def error(self, msg): + def error(self, fmt, *args, **kwargs): + log_line = self.name + " (ERROR) -> " + fmt.format(*args, **kwargs) try: - xbmc.log(self.format(msg, "ERROR"), level=xbmc.LOGERROR) + xbmc.log(log_line, level=xbmc.LOGERROR) except UnicodeEncodeError: - xbmc.log(self.format(msg, "ERROR").encode('utf-8'), level=xbmc.LOGERROR) + xbmc.log(log_line.encode('utf-8'), level=xbmc.LOGERROR) - def debug(self, msg): - if (self.enable_logging): + def debug(self, fmt, *args, **kwargs): + if self.enable_logging: + log_line = self.name + " (DEBUG) -> " + fmt.format(*args, **kwargs) try: - xbmc.log(self.format(msg, "DEBUG"), level=xbmc.LOGDEBUG) + xbmc.log(log_line, level=xbmc.LOGDEBUG) except UnicodeEncodeError: - xbmc.log(self.format(msg, "DEBUG").encode('utf-8'), level=xbmc.LOGDEBUG) - - def format(self, msg, levelValue): - return self.name + "(" + str(levelValue) + ") -> " + msg + xbmc.log(log_line.encode('utf-8'), level=xbmc.LOGDEBUG) diff --git a/resources/lib/trakttokodi.py b/resources/lib/trakttokodi.py index 12d3683..3e27740 100644 --- a/resources/lib/trakttokodi.py +++ b/resources/lib/trakttokodi.py @@ -111,7 +111,7 @@ def get_match(item_type, title, year, imdb_id): results = results.get('SearchHints') if results is None: results = [] - log.debug('SearchHints jsonData: ' + str(results)) + log.debug('SearchHints jsonData: {0}', results) potential_matches = [] @@ -121,12 +121,12 @@ def get_match(item_type, title, year, imdb_id): if (name == title and int(year) == production_year) or (int(year) == production_year): potential_matches.append(item) - log.debug('Potential matches: ' + str(potential_matches)) + log.debug('Potential matches: {0}', potential_matches) for item in potential_matches: item_imdb_id = get_imdb_id(item.get('ItemId')) if item_imdb_id == imdb_id: - log.debug('Found match: ' + str(item)) + log.debug('Found match: {0}', item) return item return None diff --git a/resources/lib/translation.py b/resources/lib/translation.py index 2b131d0..eb70b60 100644 --- a/resources/lib/translation.py +++ b/resources/lib/translation.py @@ -10,7 +10,7 @@ def i18n(string_id): try: return addon.getLocalizedString(STRINGS[string_id]).encode('utf-8', 'ignore') except Exception as e: - log.error('Failed String Lookup: %s (%s)' % (string_id, e)) + log.error('Failed String Lookup: {0} ({1})', string_id, e) return string_id diff --git a/resources/lib/utils.py b/resources/lib/utils.py index def3e35..70410cd 100644 --- a/resources/lib/utils.py +++ b/resources/lib/utils.py @@ -18,6 +18,7 @@ from simple_logging import SimpleLogging from clientinfo import ClientInformation from json_rpc import json_rpc from translation import i18n +from datamanager import DataManager # define our global download utils downloadUtils = DownloadUtils() @@ -31,13 +32,13 @@ class PlayUtils(): addonSettings = xbmcaddon.Addon(id='plugin.video.embycon') playback_type = addonSettings.getSetting("playback_type") server = downloadUtils.getServer() - log.debug("playback_type: " + playback_type) + log.debug("playback_type: {0}", playback_type) if force_transcode: log.debug("playback_type: FORCED_TRANSCODE") playurl = None - log.debug("play_session_id: " + play_session_id) + log.debug("play_session_id: {0}", play_session_id) media_source_id = media_source.get("Id") - log.debug("media_source_id: " + media_source_id) + log.debug("media_source_id: {0}", media_source_id) is_h265 = False streams = media_source.get("MediaStreams", []) @@ -62,7 +63,7 @@ class PlayUtils(): if playback_type == "2": playback_bitrate = addonSettings.getSetting("playback_bitrate") - log.debug("playback_bitrate: " + playback_bitrate) + log.debug("playback_bitrate: {0}", playback_bitrate) playback_max_width = addonSettings.getSetting("playback_max_width") playback_video_force_8 = addonSettings.getSetting("playback_video_force_8") == "true" @@ -117,7 +118,7 @@ class PlayUtils(): user_token = downloadUtils.authenticate() playurl = playurl + "&api_key=" + user_token - log.debug("Playback URL: " + playurl) + log.debug("Playback URL: {0}", playurl) return playurl.encode('utf-8'), playback_type def getStrmDetails(self, media_source): @@ -135,12 +136,14 @@ class PlayUtils(): lines = contents.split(line_break) for line in lines: line = line.strip() - log.debug("STRM Line: " + line) + log.debug("STRM Line: {0}", line) if line.startswith('#KODIPROP:'): match = re.search('#KODIPROP:(?P[^=]+?)=(?P.+)', line) if match: - log.debug("STRM property found: " + match.group('item_property') + " Value: " + match.group('property_value')) - listitem_props.append((match.group('item_property'), match.group('property_value'))) + item_property = match.group('item_property') + property_value = match.group('property_value') + log.debug("STRM property found: {0} value: {1}", item_property, property_value) + listitem_props.append((item_property, property_value)) else: log.debug("STRM #KODIPROP incorrect format") elif line.startswith('#'): @@ -150,7 +153,7 @@ class PlayUtils(): playurl = line log.debug("STRM playback url found") - log.debug("Playback URL: " + str(playurl) + " ListItem Properties: " + str(listitem_props)) + log.debug("Playback URL: {0} ListItem Properties: {1}", playurl, listitem_props) return playurl, listitem_props @@ -276,13 +279,13 @@ def cache_artwork(): web_port = {"setting": "services.webserverport"} result = json_rpc('Settings.GetSettingValue').execute(web_port) xbmc_port = result['result']['value'] - log.debug("xbmc_port: " + str(xbmc_port)) + log.debug("xbmc_port: {0}", xbmc_port) # get the user web_user = {"setting": "services.webserverusername"} result = json_rpc('Settings.GetSettingValue').execute(web_user) xbmc_username = result['result']['value'] - log.debug("xbmc_username: " + str(xbmc_username)) + log.debug("xbmc_username: {0}", xbmc_username) # get the password web_pass = {"setting": "services.webserverpassword"} @@ -298,7 +301,7 @@ def cache_artwork(): json_result = json_rpc('Textures.GetTextures').execute() textures = json_result.get("result", {}).get("textures", []) - log.debug("texture ids: " + str(textures)) + log.debug("texture ids: {0}", textures) total = len(textures) for texture in textures: texture_id = texture["textureid"] @@ -340,11 +343,10 @@ def cache_artwork(): '&ImageTypeLimit=1' + '&format=json') - results = downloadUtils.downloadUrl(url, method="GET") + data_manager = DataManager() + results = data_manager.GetContent(url) if results is None: results = [] - else: - results = json.loads(results) if isinstance(results, dict): results = results.get("Items") @@ -360,10 +362,10 @@ def cache_artwork(): if image_url not in texture_urls and not image_url.endswith("&Tag=") and len(image_url) > 0: missing_texture_urls.add(image_url) - log.debug("texture_urls:" + str(texture_urls)) - log.debug("missing_texture_urls: " + str(missing_texture_urls)) - log.debug("Number of existing textures: %s" % len(texture_urls)) - log.debug("Number of missing textures: %s" % len(missing_texture_urls)) + log.debug("texture_urls: {0}", texture_urls) + log.debug("missing_texture_urls: {0}", missing_texture_urls) + log.debug("Number of existing textures: {0}", len(texture_urls)) + log.debug("Number of missing textures: {0}", len(missing_texture_urls)) kodi_http_server = "localhost:" + str(xbmc_port) headers = {} @@ -378,10 +380,10 @@ def cache_artwork(): count_done = 0 for get_url in missing_texture_urls: - log.debug("texture_url:" + get_url) + log.debug("texture_url: {0}", get_url) url = double_urlencode(get_url) kodi_texture_url = ("/image/image://%s" % url) - log.debug("kodi_texture_url: " + kodi_texture_url) + log.debug("kodi_texture_url: {0}", kodi_texture_url) percentage = int((float(index) / float(total)) * 100) message = "%s of %s" % (index, total) @@ -392,7 +394,7 @@ def cache_artwork(): data = conn.getresponse() if data.status == 200: count_done += 1 - log.debug("Get Image Result: " + str(data.status)) + log.debug("Get Image Result: {0}", data.status) index += 1 if pdialog.iscanceled(): diff --git a/resources/lib/websocket_client.py b/resources/lib/websocket_client.py index 4f26477..db0a073 100644 --- a/resources/lib/websocket_client.py +++ b/resources/lib/websocket_client.py @@ -48,17 +48,17 @@ class WebSocketClient(threading.Thread): self._playstate(data) elif message_type == "UserDataChanged": - log.debug("WebSocket Message UserDataChanged: %s" % message) + log.debug("WebSocket Message UserDataChanged: {0}", message) elif message_type == "LibraryChanged": - log.debug("WebSocket Message LibraryChanged: %s" % message) + log.debug("WebSocket Message LibraryChanged: {0}", message) elif message_type == "GeneralCommand": data = result['Data'] self._general_commands(data) else: - log.debug("WebSocket Message Type: %s" % message) + log.debug("WebSocket Message Type: {0}", message) def _play(cls, data): @@ -67,7 +67,7 @@ class WebSocketClient(threading.Thread): if command == 'PlayNow': startat = data.get('StartPositionTicks', 0) - log.debug("WebSocket Message PlayNow: %s" % data) + log.debug("WebSocket Message PlayNow: {0}", data) media_source_id = data.get("MediaSourceId", "") @@ -99,14 +99,14 @@ class WebSocketClient(threading.Thread): seek_to = data['SeekPositionTicks'] seek_time = seek_to / 10000000.0 player.seekTime(seek_time) - log.debug("Seek to %s" % seek_time) + log.debug("Seek to {0}", seek_time) elif command in actions: actions[command]() - log.debug("Command: %s completed" % command) + log.debug("Command: {0} completed", command) else: - log.debug("Unknown command: %s" % command) + log.debug("Unknown command: {0}", command) return def _general_commands(cls, data): @@ -146,7 +146,7 @@ class WebSocketClient(threading.Thread): header = arguments['Header'] text = arguments['Text'] # show notification here - log.debug("WebSocket DisplayMessage: %s" % text) + log.debug("WebSocket DisplayMessage: {0}", text) xbmcgui.Dialog().notification("EmbyCon", text) elif command == 'SendString': @@ -204,7 +204,7 @@ class WebSocketClient(threading.Thread): self.post_capabilities() def on_error(self, ws, error): - log.debug("Error: %s" % error) + log.debug("Error: {0}", error) def run(self): @@ -225,7 +225,7 @@ class WebSocketClient(threading.Thread): server = server.replace('http', "ws") websocket_url = "%s/embywebsocket?api_key=%s&deviceId=%s" % (server, token, self.device_id) - log.debug("websocket url: %s" % websocket_url) + log.debug("websocket url: {0}", websocket_url) self._client = websocket.WebSocketApp(websocket_url, on_message=self.on_message, @@ -298,5 +298,5 @@ class WebSocketClient(threading.Thread): download_utils = downloadutils.DownloadUtils() download_utils.downloadUrl(url, postBody=data, method="POST") - log.debug("Posted Capabilities: %s" % data) + log.debug("Posted Capabilities: {0}", data) diff --git a/resources/lib/widgets.py b/resources/lib/widgets.py index 0ada091..a4a9536 100644 --- a/resources/lib/widgets.py +++ b/resources/lib/widgets.py @@ -35,7 +35,7 @@ def checkForNewContent(): added_result = downloadUtils.downloadUrl(added_url, suppress=True) result = json.loads(added_result) - log.debug("LATEST_ADDED_ITEM:" + str(result)) + log.debug("LATEST_ADDED_ITEM: {0}", result) last_added_date = "" if result is not None: @@ -43,7 +43,7 @@ def checkForNewContent(): if len(items) > 0: item = items[0] last_added_date = item.get("Etag", "") - log.debug("last_added_date: " + last_added_date) + log.debug("last_added_date: {0}", last_added_date) played_url = ('{server}/emby/Users/{userid}/Items' + '?Recursive=true' + @@ -57,7 +57,7 @@ def checkForNewContent(): played_result = downloadUtils.downloadUrl(played_url, suppress=True) result = json.loads(played_result) - log.debug("LATEST_PLAYED_ITEM:" + str(result)) + log.debug("LATEST_PLAYED_ITEM: {0}", result) last_played_date = "" if result is not None: @@ -65,29 +65,29 @@ def checkForNewContent(): if len(items) > 0: item = items[0] last_played_date = item.get("Etag", "") - log.debug("last_played_date: " + last_played_date) + log.debug("last_played_date: {0}", last_played_date) home_window = HomeWindow() current_widget_hash = home_window.getProperty("embycon_widget_reload") - log.debug("Current Widget Hash: " + str(current_widget_hash)) + log.debug("Current Widget Hash: {0}", current_widget_hash) m = hashlib.md5() m.update(last_played_date + last_added_date) new_widget_hash = m.hexdigest() - log.debug("New Widget Hash: " + str(new_widget_hash)) + log.debug("New Widget Hash: {0}", new_widget_hash) if current_widget_hash != new_widget_hash: home_window.setProperty("embycon_widget_reload", new_widget_hash) - log.debug("Setting New Widget Hash: " + str(new_widget_hash)) + log.debug("Setting New Widget Hash: {0}", new_widget_hash) def getWidgetUrlContent(handle, params): - log.debug("getWidgetUrlContent Called" + str(params)) + log.debug("getWidgetUrlContent Called: {0}", params) request = params["url"] request = urllib.unquote(request) request = "{server}/emby/" + request + "&ImageTypeLimit=1&format=json" - log.debug("getWidgetUrlContent URL:" + request) + log.debug("getWidgetUrlContent URL: {0}", request) select_action = params.get("action", None) @@ -98,7 +98,7 @@ def getWidgetUrlContent(handle, params): def getSuggestions(handle, params): - log.debug("getSuggestions Called" + str(params)) + log.debug("getSuggestions Called: {0}", params) itemsUrl = ("{server}/emby/Movies/Recommendations" + "?userId={userid}" + @@ -114,7 +114,7 @@ def getSuggestions(handle, params): xbmcplugin.endOfDirectory(handle, cacheToDisc=False) def getWidgetContentNextUp(handle, params): - log.debug("getWidgetContentNextUp Called" + str(params)) + log.debug("getWidgetContentNextUp Called: {0}", params) itemsUrl = ("{server}/emby/Shows/NextUp?SeriesId=" + params["id"] + "&userId={userid}" + @@ -130,7 +130,7 @@ def getWidgetContentNextUp(handle, params): def getWidgetContentSimilar(handle, params): - log.debug("getWisgetContentSimilarMovies Called" + str(params)) + log.debug("getWisgetContentSimilarMovies Called: {0}", params) itemsUrl = ("{server}/emby/Items/" + params["id"] + "/Similar" "?userId={userid}" + @@ -147,13 +147,13 @@ def getWidgetContentSimilar(handle, params): def getWidgetContentCast(handle, params): - log.debug("getWigetContentCast Called" + str(params)) + log.debug("getWigetContentCast Called: {0}", params) server = downloadUtils.getServer() id = params["id"] data_manager = DataManager() result = data_manager.GetContent("{server}/emby/Users/{userid}/Items/" + id + "?format=json") - log.debug("ItemInfo: " + str(result)) + log.debug("ItemInfo: {0}", result) listItems = [] people = result.get("People") @@ -204,7 +204,7 @@ def populateWidgetItems(itemsUrl, override_select_action=None): if override_select_action is not None: select_action = str(override_select_action) - log.debug("WIDGET_DATE_URL: " + itemsUrl) + log.debug("WIDGET_DATE_URL: {0}", itemsUrl) # get the items data_manager = DataManager() @@ -225,7 +225,7 @@ def populateWidgetItems(itemsUrl, override_select_action=None): item_id = item["Id"] name = item["Name"] episodeDetails = "" - log.debug("WIDGET_DATE_NAME: " + name) + log.debug("WIDGET_DATE_NAME: {0}", name) title = name tvshowtitle = "" @@ -318,7 +318,7 @@ def populateWidgetItems(itemsUrl, override_select_action=None): def getWidgetContent(handle, params): - log.debug("getWigetContent Called" + str(params)) + log.debug("getWigetContent Called: {0}", params) type = params.get("type") if (type == None): diff --git a/service.py b/service.py index 984b7de..7cf405a 100644 --- a/service.py +++ b/service.py @@ -30,7 +30,7 @@ download_utils = DownloadUtils() try: download_utils.authenticate() except Exception as error: - log.error("Error with initial service auth: " + str(error)) + log.error("Error with initial service auth: {0}", error) def hasData(data): @@ -73,7 +73,7 @@ def sendProgress(): 'PlaySessionId': play_session_id } - log.debug("Sending POST progress started: %s." % postdata) + log.debug("Sending POST progress started: {0}", postdata) url = "{server}/emby/Sessions/Playing/Progress" download_utils.downloadUrl(url, postBody=postdata, method="POST") @@ -106,7 +106,7 @@ def promptForStopActions(item_id, current_possition): # item percentage complete percenatge_complete = int(((current_possition * 10000000) / runtime) * 100) - log.debug("Episode Percentage Complete: %s" % percenatge_complete) + log.debug("Episode Percentage Complete: {0}", percenatge_complete) if (prompt_delete_episode_percentage < 100 and result.get("Type", "na") == "Episode" and @@ -122,7 +122,7 @@ def promptForStopActions(item_id, current_possition): log.debug("Prompting for delete") resp = xbmcgui.Dialog().yesno(i18n('confirm_file_delete'), i18n('file_delete_confirm'), autoclose=10000) if resp: - log.debug("Deleting item: %s" % item_id) + log.debug("Deleting item: {0}", item_id) url = "{server}/emby/Items/%s?format=json" % item_id download_utils.downloadUrl(url, method="DELETE") xbmc.executebuiltin("Container.Refresh") @@ -155,7 +155,7 @@ def promptForStopActions(item_id, current_possition): jsonData = download_utils.downloadUrl(url) items_result = json.loads(jsonData) - log.debug("Prompt Next Item Details: %s" % items_result) + log.debug("Prompt Next Item Details: {0}", items_result) # find next episode item_list = items_result.get("Items", []) for item in item_list: @@ -169,7 +169,7 @@ def promptForStopActions(item_id, current_possition): if resp: next_item_id = item.get("Id") - log.debug("Playing Next Episode: %s" % next_item_id) + log.debug("Playing Next Episode: {0}", next_item_id) play_info = {} play_info["item_id"] = next_item_id @@ -188,19 +188,19 @@ def stopAll(played_information): if len(played_information) == 0: return - log.debug("played_information : " + str(played_information)) + log.debug("played_information: {0}", played_information) for item_url in played_information: data = played_information.get(item_url) if data is not None: - log.debug("item_url : " + item_url) - log.debug("item_data : " + str(data)) + log.debug("item_url: {0}", item_url) + log.debug("item_data: {0}", data) current_possition = data.get("currentPossition", 0) emby_item_id = data.get("item_id") if hasData(emby_item_id): - log.debug("Playback Stopped at: " + str(int(current_possition * 10000000))) + log.debug("Playback Stopped at: {0}", current_possition) url = "{server}/emby/Sessions/Playing/Stopped" postdata = { @@ -219,7 +219,7 @@ class Service(xbmc.Player): played_information = {} def __init__(self, *args): - log.debug("Starting monitor service: " + str(args)) + log.debug("Starting monitor service: {0}", args) self.played_information = {} def onPlayBackStarted(self): @@ -227,7 +227,7 @@ class Service(xbmc.Player): stopAll(self.played_information) current_playing_file = xbmc.Player().getPlayingFile() - log.debug("onPlayBackStarted: " + current_playing_file) + log.debug("onPlayBackStarted: {0}", current_playing_file) home_window = HomeWindow() emby_item_id = home_window.getProperty("item_id") @@ -248,7 +248,7 @@ class Service(xbmc.Player): 'PlaySessionId': play_session_id } - log.debug("Sending POST play started: %s." % postdata) + log.debug("Sending POST play started: {0}", postdata) url = "{server}/emby/Sessions/Playing" download_utils.downloadUrl(url, postBody=postdata, method="POST") @@ -260,8 +260,8 @@ class Service(xbmc.Player): data["play_session_id"] = play_session_id self.played_information[current_playing_file] = data - log.debug("ADDING_FILE : " + current_playing_file) - log.debug("ADDING_FILE : " + str(self.played_information)) + log.debug("ADDING_FILE: {0}", current_playing_file) + log.debug("ADDING_FILE: {0}", self.played_information) def onPlayBackEnded(self): # Will be called when kodi stops playing a file @@ -341,8 +341,8 @@ while not xbmc.abortRequested: checkForNewContent() except Exception as error: - log.error("Exception in Playback Monitor : " + str(error)) - log.error(traceback.format_exc()) + log.error("Exception in Playback Monitor: {0}", error) + log.error("{0}", traceback.format_exc()) xbmc.sleep(1000)