From a0efd1087fcd7eb72e39add4cea817bc704dc290 Mon Sep 17 00:00:00 2001 From: Matt Date: Sat, 25 Jul 2020 01:01:30 -0400 Subject: [PATCH] Copy log handler from JF for Kodi, modify for strings --- addon.xml | 3 + default.py | 4 +- resources/lib/action_menu.py | 14 +-- resources/lib/bitrate_dialog.py | 10 +- resources/lib/cache_images.py | 46 +++---- resources/lib/clientinfo.py | 12 +- resources/lib/context_monitor.py | 39 +----- resources/lib/datamanager.py | 26 ++-- resources/lib/dir_functions.py | 40 +++--- resources/lib/downloadutils.py | 84 ++++++------- resources/lib/filelock.py | 8 +- resources/lib/functions.py | 155 ++++++++++------------- resources/lib/image_server.py | 12 +- resources/lib/item_functions.py | 6 +- resources/lib/kodi_utils.py | 8 +- resources/lib/library_change_monitor.py | 4 +- resources/lib/loghandler.py | 157 ++++++++++++++++++++++++ resources/lib/menu_functions.py | 40 +++--- resources/lib/picture_viewer.py | 4 +- resources/lib/play_utils.py | 82 ++++++------- resources/lib/playnext.py | 16 +-- resources/lib/resume_dialog.py | 4 +- resources/lib/safe_delete_dialog.py | 8 +- resources/lib/server_detect.py | 54 ++++---- resources/lib/server_sessions.py | 6 +- resources/lib/simple_logging.py | 51 -------- resources/lib/skin_cloner.py | 16 +-- resources/lib/tracking.py | 6 +- resources/lib/trakttokodi.py | 10 +- resources/lib/translation.py | 4 +- resources/lib/utils.py | 16 +-- resources/lib/websocket_client.py | 22 ++-- resources/lib/widgets.py | 48 ++++---- service.py | 12 +- 34 files changed, 535 insertions(+), 492 deletions(-) create mode 100644 resources/lib/loghandler.py delete mode 100644 resources/lib/simple_logging.py diff --git a/addon.xml b/addon.xml index 1254dc5..75fadf2 100644 --- a/addon.xml +++ b/addon.xml @@ -7,6 +7,9 @@ + + + video audio diff --git a/default.py b/default.py index 431890a..10757b9 100644 --- a/default.py +++ b/default.py @@ -2,11 +2,11 @@ import xbmcaddon -from resources.lib.simple_logging import SimpleLogging +from resources.lib.loghandler import LazyLogger from resources.lib.functions import main_entry_point from resources.lib.tracking import set_timing_enabled -log = SimpleLogging('default') +log = LazyLogger('default') settings = xbmcaddon.Addon() log_timing_data = settings.getSetting('log_timing') == "true" diff --git a/resources/lib/action_menu.py b/resources/lib/action_menu.py index f5d53ae..79cad7c 100644 --- a/resources/lib/action_menu.py +++ b/resources/lib/action_menu.py @@ -6,9 +6,9 @@ import threading import xbmc import xbmcgui -from .simple_logging import SimpleLogging +from .loghandler import LazyLogger -log = SimpleLogging(__name__) +log = LazyLogger(__name__) class ActionAutoClose(threading.Thread): @@ -27,7 +27,7 @@ class ActionAutoClose(threading.Thread): log.debug("ActionAutoClose Running") while not xbmc.abortRequested and not self.stop_thread: time_since_last = time.time() - self.last_interaction - log.debug("ActionAutoClose time_since_last : {0}", time_since_last) + log.debug("ActionAutoClose time_since_last : {0}".format(time_since_last)) if time_since_last > 20: log.debug("ActionAutoClose Closing Parent") @@ -40,7 +40,7 @@ class ActionAutoClose(threading.Thread): def set_last(self): self.last_interaction = time.time() - log.debug("ActionAutoClose set_last : {0}", self.last_interaction) + log.debug("ActionAutoClose set_last : {0}".format(self.last_interaction)) def stop(self): log.debug("ActionAutoClose stop_thread called") @@ -79,7 +79,7 @@ class ActionMenu(xbmcgui.WindowXMLDialog): pass def onMessage(self, message): - log.debug("ActionMenu: onMessage: {0}", message) + log.debug("ActionMenu: onMessage: {0}".format(message)) def onAction(self, action): @@ -91,12 +91,12 @@ class ActionMenu(xbmcgui.WindowXMLDialog): self.close() else: self.auto_close_thread.set_last() - log.debug("ActionMenu: onAction: {0}", action.getId()) + log.debug("ActionMenu: onAction: {0}".format(action.getId())) def onClick(self, control_id): if control_id == 3000: self.selected_action = self.listControl.getSelectedItem() - log.debug("ActionMenu: Selected Item: {0}", self.selected_action) + log.debug("ActionMenu: Selected Item: {0}".format(self.selected_action)) self.auto_close_thread.stop() self.close() diff --git a/resources/lib/bitrate_dialog.py b/resources/lib/bitrate_dialog.py index 9daae08..a617b23 100644 --- a/resources/lib/bitrate_dialog.py +++ b/resources/lib/bitrate_dialog.py @@ -1,9 +1,9 @@ import xbmc import xbmcgui -from .simple_logging import SimpleLogging +from .loghandler import LazyLogger -log = SimpleLogging(__name__) +log = LazyLogger(__name__) class BitrateDialog(xbmcgui.WindowXMLDialog): @@ -35,7 +35,7 @@ class BitrateDialog(xbmcgui.WindowXMLDialog): pass def onMessage(self, message): - log.debug("ActionMenu: onMessage: {0}", message) + log.debug("ActionMenu: onMessage: {0}".format(message)) def onAction(self, action): @@ -54,5 +54,5 @@ class BitrateDialog(xbmcgui.WindowXMLDialog): def onClick(self, control_id): if control_id == 3000: - log.debug("ActionMenu: Selected Item: {0}", control_id) - #self.close() \ No newline at end of file + log.debug("ActionMenu: Selected Item: {0}".format(control_id)) + #self.close() diff --git a/resources/lib/cache_images.py b/resources/lib/cache_images.py index ad92dd9..24d2c71 100644 --- a/resources/lib/cache_images.py +++ b/resources/lib/cache_images.py @@ -14,7 +14,7 @@ import xbmc import xbmcaddon from .downloadutils import DownloadUtils -from .simple_logging import SimpleLogging +from .loghandler import LazyLogger from .jsonrpc import JsonRpc, get_value from .translation import string_load from .datamanager import DataManager @@ -22,7 +22,7 @@ from .utils import get_art, double_urlencode from .kodi_utils import HomeWindow downloadUtils = DownloadUtils() -log = SimpleLogging(__name__) +log = LazyLogger(__name__) class CacheArtwork(threading.Thread): @@ -62,7 +62,7 @@ class CacheArtwork(threading.Thread): monitor.waitForAbort(5) - log.debug("CacheArtwork background thread exited : stop_all_activity : {0}", self.stop_all_activity) + log.debug("CacheArtwork background thread exited : stop_all_activity : {0}".format(self.stop_all_activity)) @staticmethod def delete_cached_images(item_id): @@ -74,7 +74,7 @@ class CacheArtwork(threading.Thread): item_image_url_part = "Items/%s/Images/" % item_id item_image_url_part = item_image_url_part.replace("/", "%2f") - log.debug("texture ids: {0}", item_image_url_part) + log.debug("texture ids: {0}".format(item_image_url_part)) # is the web server enabled web_query = {"setting": "services.webserver"} @@ -87,7 +87,7 @@ class CacheArtwork(threading.Thread): params = {"properties": ["url"]} json_result = JsonRpc('Textures.GetTextures').execute(params) textures = json_result.get("result", {}).get("textures", []) - log.debug("texture ids: {0}", textures) + log.debug("texture ids: {0}".format(textures)) progress.update(70, string_load(30346)) @@ -97,7 +97,7 @@ class CacheArtwork(threading.Thread): texture_url = texture["url"] if item_image_url_part in texture_url: delete_count += 1 - log.debug("removing texture id: {0}", texture_id) + log.debug("removing texture id: {0}".format(texture_id)) params = {"textureid": int(texture_id)} JsonRpc('Textures.RemoveTexture').execute(params) @@ -141,8 +141,8 @@ class CacheArtwork(threading.Thread): jellyfin_texture_urls = self.get_jellyfin_artwork(delete_pdialog) - log.debug("kodi textures: {0}", textures) - log.debug("jellyfin texture urls: {0}", jellyfin_texture_urls) + log.debug("kodi textures: {0}".format(textures)) + log.debug("jellyfin texture urls: {0}".format(jellyfin_texture_urls)) if jellyfin_texture_urls is not None: @@ -157,7 +157,7 @@ class CacheArtwork(threading.Thread): unused_texture_ids.add(texture["textureid"]) total = len(unused_texture_ids) - log.debug("unused texture ids: {0}", unused_texture_ids) + log.debug("unused texture ids: {0}".format(unused_texture_ids)) for texture_id in unused_texture_ids: params = {"textureid": int(texture_id)} @@ -206,11 +206,11 @@ class CacheArtwork(threading.Thread): try: result_text = self.cache_artwork(dp) except Exception as err: - log.error("Cache Images Failed : {0}", err) + log.error("Cache Images Failed : {0}".format(err)) dp.close() del dp if result_text is not None: - log.debug("Cache Images reuslt : {0}", " - ".join(result_text)) + log.debug("Cache Images reuslt : {0}".format(" - ".join(result_text))) def get_jellyfin_artwork(self, progress): log.debug("get_jellyfin_artwork") @@ -233,7 +233,7 @@ class CacheArtwork(threading.Thread): results = results.get("Items") server = downloadUtils.get_server() - log.debug("Jellyfin Item Count Count: {0}", len(results)) + log.debug("Jellyfin Item Count Count: {0}".format(len(results))) if self.stop_all_activity: return None @@ -260,11 +260,11 @@ class CacheArtwork(threading.Thread): # get the port xbmc_port = get_value("services.webserverport") - log.debug("xbmc_port: {0}", xbmc_port) + log.debug("xbmc_port: {0}".format(xbmc_port)) # get the user xbmc_username = get_value("services.webserverusername") - log.debug("xbmc_username: {0}", xbmc_username) + log.debug("xbmc_username: {0}".format(xbmc_username)) # get the password xbmc_password = get_value("services.webserverpassword") @@ -274,7 +274,7 @@ class CacheArtwork(threading.Thread): params = {"properties": ["url"]} json_result = JsonRpc('Textures.GetTextures').execute(params) textures = json_result.get("result", {}).get("textures", []) - log.debug("Textures.GetTextures Count: {0}", len(textures)) + log.debug("Textures.GetTextures Count: {0}".format(len(textures))) if self.stop_all_activity: return @@ -292,7 +292,7 @@ class CacheArtwork(threading.Thread): del textures del json_result - log.debug("texture_urls Count: {0}", len(texture_urls)) + log.debug("texture_urls Count: {0}".format(len(texture_urls))) if self.stop_all_activity: return @@ -312,11 +312,11 @@ class CacheArtwork(threading.Thread): if self.stop_all_activity: return - - 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)) + + log.debug("texture_urls: {0}".format(texture_urls)) + log.debug("missing_texture_urls: {0}".format(missing_texture_urls)) + log.debug("Number of existing textures: {0}".format(len(texture_urls))) + log.debug("Number of missing textures: {0}".format(len(missing_texture_urls))) kodi_http_server = "localhost:" + str(xbmc_port) headers = {} @@ -331,7 +331,7 @@ class CacheArtwork(threading.Thread): # log.debug("texture_url: {0}", get_url) url = double_urlencode(get_url) kodi_texture_url = ("/image/image://%s" % url) - log.debug("kodi_texture_url: {0}", kodi_texture_url) + log.debug("kodi_texture_url: {0}".format(kodi_texture_url)) percentage = int((float(index) / float(total)) * 100) message = "%s of %s" % (index, total) @@ -342,7 +342,7 @@ class CacheArtwork(threading.Thread): if data.status_code == 200: count_done += 1 - log.debug("Get Image Result: {0}", data.status_code) + log.debug("Get Image Result: {0}".format(data.status_code)) # if progress.iscanceled(): # if "iscanceled" in dir(progress) and progress.iscanceled(): diff --git a/resources/lib/clientinfo.py b/resources/lib/clientinfo.py index e871dd5..f82e28b 100644 --- a/resources/lib/clientinfo.py +++ b/resources/lib/clientinfo.py @@ -6,9 +6,9 @@ import xbmc import xbmcvfs from .kodi_utils import HomeWindow -from .simple_logging import SimpleLogging +from .loghandler import LazyLogger -log = SimpleLogging(__name__) +log = LazyLogger(__name__) class ClientInformation: @@ -23,20 +23,20 @@ class ClientInformation: return client_id jellyfin_guid_path = xbmc.translatePath("special://temp/jellycon_guid").decode('utf-8') - log.debug("jellyfin_guid_path: {0}", jellyfin_guid_path) + log.debug("jellyfin_guid_path: {0}".format(jellyfin_guid_path)) guid = xbmcvfs.File(jellyfin_guid_path) client_id = guid.read() guid.close() if not client_id: client_id = str("%012X" % uuid4()) - log.debug("Generating a new guid: {0}", client_id) + log.debug("Generating a new guid: {0}".format(client_id)) guid = xbmcvfs.File(jellyfin_guid_path, 'w') guid.write(client_id) guid.close() - log.debug("jellyfin_client_id (NEW): {0}", client_id) + log.debug("jellyfin_client_id (NEW): {0}".format(client_id)) else: - log.debug("jellyfin_client_id: {0}", client_id) + log.debug("jellyfin_client_id: {0}".format(client_id)) window.set_property("client_id", client_id) return client_id diff --git a/resources/lib/context_monitor.py b/resources/lib/context_monitor.py index b02209a..aa77267 100644 --- a/resources/lib/context_monitor.py +++ b/resources/lib/context_monitor.py @@ -1,10 +1,10 @@ import threading import xbmc -from .simple_logging import SimpleLogging +from .loghandler import LazyLogger from resources.lib.functions import show_menu -log = SimpleLogging(__name__) +log = LazyLogger(__name__) class ContextMonitor(threading.Thread): @@ -33,41 +33,6 @@ class ContextMonitor(threading.Thread): xbmc.sleep(100) - ''' - context_up = False - is_jellycon_item = False - - while not xbmc.abortRequested and not self.stop_thread: - - if xbmc.getCondVisibility("Window.IsActive(fullscreenvideo) | Window.IsActive(visualisation)"): - xbmc.sleep(1000) - else: - if xbmc.getCondVisibility("Window.IsVisible(contextmenu)"): - context_up = True - if is_jellycon_item: - xbmc.executebuiltin("Dialog.Close(contextmenu,true)") - else: - if context_up: # context now down, do something - context_up = False - container_id = xbmc.getInfoLabel("System.CurrentControlID") - log.debug("ContextMonitor Container ID: {0}", container_id) - item_id = xbmc.getInfoLabel("Container(" + str(container_id) + ").ListItem.Property(id)") - log.debug("ContextMonitor Item ID: {0}", item_id) - if item_id: - params = {} - params["item_id"] = item_id - show_menu(params) - - container_id = xbmc.getInfoLabel("System.CurrentControlID") - condition = ("String.StartsWith(Container(" + str(container_id) + - ").ListItem.Path,plugin://plugin.video.jellycon) + !String.IsEmpty(Container(" + - str(container_id) + ").ListItem.Property(id))") - is_jellycon_item = xbmc.getCondVisibility(condition) - - xbmc.sleep(200) - - ''' - log.debug("ContextMonitor Thread Exited") def stop_monitor(self): diff --git a/resources/lib/datamanager.py b/resources/lib/datamanager.py index 71d9137..8d37130 100644 --- a/resources/lib/datamanager.py +++ b/resources/lib/datamanager.py @@ -9,7 +9,7 @@ import cPickle import time from .downloadutils import DownloadUtils -from .simple_logging import SimpleLogging +from .loghandler import LazyLogger from .item_functions import extract_item_info from .kodi_utils import HomeWindow from .translation import string_load @@ -21,7 +21,7 @@ import xbmcaddon import xbmcvfs import xbmcgui -log = SimpleLogging(__name__) +log = LazyLogger(__name__) class CacheItem: @@ -60,7 +60,7 @@ class DataManager: def get_items(self, url, gui_options, use_cache=False): home_window = HomeWindow() - log.debug("last_content_url : use_cache={0} url={1}", use_cache, url) + log.debug("last_content_url : use_cache={0} url={1}".format(use_cache, url)) home_window.set_property("last_content_url", url) download_utils = DownloadUtils() @@ -102,7 +102,7 @@ class DataManager: item_list = cache_item.item_list total_records = cache_item.total_records except Exception as err: - log.error("Pickle Data Load Failed : {0}", err) + log.error("Pickle Data Load Failed : {0}".format(err)) item_list = None # we need to load the list item data form the server @@ -206,7 +206,7 @@ class CacheManagerThread(threading.Thread): else: log.debug("CacheManagerThread : Reloading to recheck data hashes") cached_hash = self.cached_item.item_list_hash - log.debug("CacheManagerThread : Cache Hash : {0}", cached_hash) + log.debug("CacheManagerThread : Cache Hash : {0}".format(cached_hash)) data_manager = DataManager() results = data_manager.get_content(self.cached_item.items_url) @@ -232,7 +232,7 @@ class CacheManagerThread(threading.Thread): return loaded_hash = self.get_data_hash(loaded_items) - log.debug("CacheManagerThread : Loaded Hash : {0}", loaded_hash) + log.debug("CacheManagerThread : Loaded Hash : {0}".format(loaded_hash)) # if they dont match then save the data and trigger a content reload if cached_hash != loaded_hash: @@ -252,7 +252,7 @@ class CacheManagerThread(threading.Thread): # TODO: probably should only set this in simple check mode current_time_stamp = str(time.time()) home_window.set_property("jellycon_widget_reload", current_time_stamp) - log.debug("Setting New Widget Hash: {0}", current_time_stamp) + log.debug("Setting New Widget Hash: {0}".format(current_time_stamp)) log.debug("CacheManagerThread : Sending container refresh") xbmc.executebuiltin("Container.Refresh") @@ -276,7 +276,7 @@ def clear_cached_server_data(): del_count = 0 for filename in files: if filename.startswith("cache_") and filename.endswith(".pickle"): - log.debug("Deleteing CacheFile: {0}", filename) + log.debug("Deleteing CacheFile: {0}".format(filename)) xbmcvfs.delete(os.path.join(addon_dir, filename)) del_count += 1 @@ -293,7 +293,7 @@ def clear_old_cache_data(): del_count = 0 for filename in files: if filename.startswith("cache_") and filename.endswith(".pickle"): - log.debug("clear_old_cache_data() : Checking CacheFile : {0}", filename) + log.debug("clear_old_cache_data() : Checking CacheFile : {0}".format(filename)) cache_item = None for x in range(0, 5): @@ -304,7 +304,7 @@ def clear_old_cache_data(): cache_item = cPickle.load(handle) break except Exception as error: - log.debug("clear_old_cache_data() : Pickle load error : {0}", error) + log.debug("clear_old_cache_data() : Pickle load error : {0}".format(error)) cache_item = None xbmc.sleep(1000) @@ -313,9 +313,9 @@ def clear_old_cache_data(): if cache_item.date_last_used is not None: item_last_used = time.time() - cache_item.date_last_used - log.debug("clear_old_cache_data() : Cache item last used : {0} sec ago", item_last_used) + log.debug("clear_old_cache_data() : Cache item last used : {0} sec ago".format(item_last_used)) if item_last_used == -1 or item_last_used > (3600 * 24 * 7): - log.debug("clear_old_cache_data() : Deleting cache item age : {0}", item_last_used) + log.debug("clear_old_cache_data() : Deleting cache item age : {0}".format(item_last_used)) data_file = os.path.join(addon_dir, filename) with FileLock(data_file + ".locked", timeout=5): xbmcvfs.delete(data_file) @@ -326,4 +326,4 @@ def clear_old_cache_data(): with FileLock(data_file + ".locked", timeout=5): xbmcvfs.delete(data_file) - log.debug("clear_old_cache_data() : Cache items deleted : {0}", del_count) + log.debug("clear_old_cache_data() : Cache items deleted : {0}".format(del_count)) diff --git a/resources/lib/dir_functions.py b/resources/lib/dir_functions.py index af3f7d1..e8159ba 100644 --- a/resources/lib/dir_functions.py +++ b/resources/lib/dir_functions.py @@ -12,12 +12,12 @@ from .datamanager import DataManager from .kodi_utils import HomeWindow from .downloadutils import DownloadUtils from .translation import string_load -from .simple_logging import SimpleLogging +from .loghandler import LazyLogger from .item_functions import add_gui_item, ItemDetails from .utils import send_event_notification from .tracking import timer -log = SimpleLogging(__name__) +log = LazyLogger(__name__) @timer @@ -29,8 +29,8 @@ def get_content(url, params): if not media_type: xbmcgui.Dialog().ok(string_load(30135), string_load(30139)) - log.debug("URL: {0}", url) - log.debug("MediaType: {0}", media_type) + log.debug("URL: {0}".format(url)) + log.debug("MediaType: {0}".format(media_type)) pluginhandle = int(sys.argv[1]) settings = xbmcaddon.Addon() @@ -71,7 +71,7 @@ def get_content(url, params): elif media_type == "playlists": view_type = "Playlists" - log.debug("media_type:{0} content_type:{1} view_type:{2} ", media_type, content_type, view_type) + log.debug("media_type:{0} content_type:{1} view_type:{2} ".format(media_type, content_type, view_type)) # show a progress indicator if needed progress = None @@ -88,22 +88,22 @@ def get_content(url, params): if page_limit > 0 and media_type.startswith("movie"): m = re.search('StartIndex=([0-9]{1,4})', url) if m and m.group(1): - log.debug("UPDATING NEXT URL: {0}", url) + log.debug("UPDATING NEXT URL: {0}".format(url)) start_index = int(m.group(1)) - log.debug("current_start : {0}", start_index) + log.debug("current_start : {0}".format(start_index)) if start_index > 0: prev_index = start_index - page_limit if prev_index < 0: prev_index = 0 url_prev = re.sub('StartIndex=([0-9]{1,4})', 'StartIndex=' + str(prev_index), url) url_next = re.sub('StartIndex=([0-9]{1,4})', 'StartIndex=' + str(start_index + page_limit), url) - log.debug("UPDATING NEXT URL: {0}", url_next) + log.debug("UPDATING NEXT URL: {0}".format(url_next)) else: - log.debug("ADDING NEXT URL: {0}", url) + log.debug("ADDING NEXT URL: {0}".format(url)) url_next = url + "&StartIndex=" + str(start_index + page_limit) + "&Limit=" + str(page_limit) url = url + "&StartIndex=" + str(start_index) + "&Limit=" + str(page_limit) - log.debug("ADDING NEXT URL: {0}", url_next) + log.debug("ADDING NEXT URL: {0}".format(url_next)) # use the data manager to get the data # result = dataManager.GetContent(url) @@ -118,7 +118,7 @@ def get_content(url, params): if dir_items is None: return - log.debug("total_records: {0}", total_records) + log.debug("total_records: {0}".format(total_records)) # add paging items if page_limit > 0 and media_type.startswith("movie"): @@ -126,7 +126,7 @@ def get_content(url, params): list_item = xbmcgui.ListItem("Prev Page (" + str(start_index - page_limit + 1) + "-" + str(start_index) + " of " + str(total_records) + ")") u = sys.argv[0] + "?url=" + urllib.quote(url_prev) + "&mode=GET_CONTENT&media_type=movies" - log.debug("ADDING PREV ListItem: {0} - {1}", u, list_item) + log.debug("ADDING PREV ListItem: {0} - {1}".format(u, list_item)) dir_items.insert(0, (u, list_item, True)) if start_index + page_limit < total_records: @@ -136,7 +136,7 @@ def get_content(url, params): list_item = xbmcgui.ListItem("Next Page (" + str(start_index + page_limit + 1) + "-" + str(upper_count) + " of " + str(total_records) + ")") u = sys.argv[0] + "?url=" + urllib.quote(url_next) + "&mode=GET_CONTENT&media_type=movies" - log.debug("ADDING NEXT ListItem: {0} - {1}", u, list_item) + log.debug("ADDING NEXT ListItem: {0} - {1}".format(u, list_item)) dir_items.append((u, list_item, True)) # set the Kodi content type @@ -144,7 +144,7 @@ def get_content(url, params): xbmcplugin.setContent(pluginhandle, content_type) elif detected_type is not None: # if the media type is not set then try to use the detected type - log.debug("Detected content type: {0}", detected_type) + log.debug("Detected content type: {0}".format(detected_type)) if detected_type == "Movie": view_type = "Movies" content_type = 'movies' @@ -166,11 +166,11 @@ def get_content(url, params): view_key = "view-" + content_type view_id = settings.getSetting(view_key) if view_id: - log.debug("Setting view for type:{0} to id:{1}", view_key, view_id) + log.debug("Setting view for type:{0} to id:{1}".format(view_key, view_id)) display_items_notification = {"view_id": view_id} send_event_notification("set_view", display_items_notification) else: - log.debug("No view id for view type:{0}", view_key) + log.debug("No view id for view type:{0}".format(view_key)) # send display items event # display_items_notification = {"view_type": view_type} @@ -185,7 +185,7 @@ def get_content(url, params): def set_sort(pluginhandle, view_type, default_sort): - log.debug("SETTING_SORT for media type: {0}", view_type) + log.debug("SETTING_SORT for media type: {0}".format(view_type)) if default_sort == "none": xbmcplugin.addSortMethod(pluginhandle, xbmcplugin.SORT_METHOD_UNSORTED) @@ -202,7 +202,7 @@ def set_sort(pluginhandle, view_type, default_sort): settings = xbmcaddon.Addon() preset_sort_order = settings.getSetting("sort-" + view_type) - log.debug("SETTING_SORT preset_sort_order: {0}", preset_sort_order) + log.debug("SETTING_SORT preset_sort_order: {0}".format(preset_sort_order)) if preset_sort_order in sorting_order_mapping: xbmcplugin.addSortMethod(pluginhandle, sorting_order_mapping[preset_sort_order]) @@ -311,7 +311,7 @@ def process_directory(url, progress, params, use_cache_data=False): detected_type = item_details.item_type if item_details.item_type == "Season" and first_season_item is None: - log.debug("Setting First Season to : {0}", item_details.__dict__) + log.debug("Setting First Season to : {0}".format(item_details.__dict__)) first_season_item = item_details total_unwatched += item_details.unwatched_episodes @@ -357,7 +357,7 @@ def process_directory(url, progress, params, use_cache_data=False): if gui_item: dir_items.append(gui_item) else: - log.debug("Dropping empty folder item : {0}", item_details.__dict__) + log.debug("Dropping empty folder item : {0}".format(item_details.__dict__)) elif item_details.item_type == "MusicArtist": u = ('{server}/Users/{userid}/items' + diff --git a/resources/lib/downloadutils.py b/resources/lib/downloadutils.py index e93dab3..be1aa53 100644 --- a/resources/lib/downloadutils.py +++ b/resources/lib/downloadutils.py @@ -1,4 +1,5 @@ # Gnu General Public License - see LICENSE.TXT +from __future__ import unicode_literals import xbmcgui import xbmcaddon @@ -17,11 +18,11 @@ from traceback import format_exc from .kodi_utils import HomeWindow from .clientinfo import ClientInformation -from .simple_logging import SimpleLogging +from .loghandler import LazyLogger from .translation import string_load from .tracking import timer -log = SimpleLogging(__name__) +log = LazyLogger(__name__) def save_user_details(settings, user_name, user_password): @@ -105,10 +106,10 @@ class DownloadUtils: self.use_https = False if settings.getSetting('protocol') == "1": self.use_https = True - log.debug("use_https: {0}", self.use_https) + log.debug("use_https: {0}".format(self.use_https)) self.verify_cert = settings.getSetting('verify_cert') == 'true' - log.debug("verify_cert: {0}", self.verify_cert) + log.debug("verify_cert: {0}".format(self.verify_cert)) def post_capabilities(self): @@ -152,7 +153,7 @@ class DownloadUtils: } self.download_url(url, post_body=data, method="POST") - log.debug("Posted Capabilities: {0}", data) + log.debug("Posted Capabilities: {0}".format(data)) def get_item_playback_info(self, item_id, force_transcode): @@ -333,11 +334,11 @@ class DownloadUtils: else: url = "{server}/Items/%s/PlaybackInfo?MaxStreamingBitrate=%s" % (item_id, bitrate) - log.debug("PlaybackInfo : {0}", url) - log.debug("PlaybackInfo : {0}", profile) + log.debug("PlaybackInfo : {0}".format(url)) + log.debug("PlaybackInfo : {0}".format(profile)) play_info_result = self.download_url(url, post_body=playback_info, method="POST") play_info_result = json.loads(play_info_result) - log.debug("PlaybackInfo : {0}", play_info_result) + log.debug("PlaybackInfo : {0}".format(play_info_result)) return play_info_result @@ -486,7 +487,7 @@ class DownloadUtils: user_image = window.get_property("userimage") if userid and user_image: - log.debug("JellyCon DownloadUtils -> Returning saved UserID: {0}", userid) + log.debug("JellyCon DownloadUtils -> Returning saved UserID: {0}".format(userid)) return userid settings = xbmcaddon.Addon() @@ -495,33 +496,33 @@ class DownloadUtils: if not user_name: return "" - log.debug("Looking for user name: {0}", user_name) + log.debug("Looking for user name: {0}".format(user_name)) try: json_data = self.download_url("{server}/Users/Public?format=json", suppress=True, authenticate=False) except Exception as msg: - log.error("Get User unable to connect: {0}", msg) + log.error("Get User unable to connect: {0}".format(msg)) return "" - log.debug("GETUSER_JSONDATA_01: {0}", json_data) + log.debug("GETUSER_JSONDATA_01: {0}".format(json_data)) try: result = json.loads(json_data) except Exception as e: - log.debug("Could not load user data: {0}", e) + log.debug("Could not load user data: {0}".format(e)) return "" if result is None: return "" - log.debug("GETUSER_JSONDATA_02: {0}", result) + log.debug("GETUSER_JSONDATA_02: {0}".format(result)) secure = False for user in result: if user.get("Name") == unicode(user_name, "utf-8"): userid = user.get("Id") user_image = self.get_user_artwork(user, 'Primary') - log.debug("Username Found: {0}", user.get("Name")) + log.debug("Username Found: {0}".format(user.get("Name"))) if user.get("HasPassword", False): secure = True log.debug("Username Is Secure (HasPassword=True)") @@ -545,7 +546,7 @@ class DownloadUtils: string_load(30045), icon="special://home/addons/plugin.video.jellycon/icon.png") - log.debug("userid: {0}", userid) + log.debug("userid: {0}".format(userid)) window.set_property("userid", userid) window.set_property("userimage", user_image) @@ -558,7 +559,7 @@ class DownloadUtils: token = window.get_property("AccessToken") if token is not None and token != "": - log.debug("JellyCon DownloadUtils -> Returning saved AccessToken: {0}", token) + log.debug("JellyCon DownloadUtils -> Returning saved AccessToken: {0}".format(token)) return token settings = xbmcaddon.Addon() @@ -573,7 +574,7 @@ class DownloadUtils: message_data = "username=" + user_name + "&pw=" + pwd_text resp = self.download_url(url, post_body=message_data, method="POST", suppress=True, authenticate=False) - log.debug("AuthenticateByName: {0}", resp) + log.debug("AuthenticateByName: {0}".format(resp)) access_token = None userid = None @@ -586,8 +587,8 @@ class DownloadUtils: pass if access_token is not None: - log.debug("User Authenticated: {0}", access_token) - log.debug("User Id: {0}", userid) + log.debug("User Authenticated: {0}".format(access_token)) + log.debug("User Id: {0}".format(userid)) window.set_property("AccessToken", access_token) window.set_property("userid", userid) # WINDOW.setProperty("userimage", "") @@ -636,7 +637,7 @@ class DownloadUtils: if auth_token != "": headers["X-MediaBrowser-Token"] = auth_token - log.debug("JellyCon Authentication Header: {0}", headers) + log.debug("JellyCon Authentication Header: {0}".format(headers)) return headers @timer @@ -656,7 +657,7 @@ class DownloadUtils: if settings.getSetting("suppressErrors") == "true": suppress = True - log.debug("Before: {0}", url) + log.debug("Before: {0}".format(url)) if url.find("{server}") != -1: server = self.get_server() @@ -685,8 +686,8 @@ class DownloadUtils: return "null" url = url.replace("{random_movies}", random_movies) - log.debug("After: {0}", url) - + log.debug("After: {0}".format(url)) + try: url_bits = urlparse(url.strip()) user_name = url_bits.username @@ -701,37 +702,38 @@ class DownloadUtils: head["Authorization"] = 'Basic %s' % user_and_pass head["User-Agent"] = "JellyCon-" + ClientInformation().get_version() - log.debug("HEADERS: {0}", head) + log.debug("HEADERS: {0}".format(head)) http_request = getattr(requests, method.lower()) if post_body: - if isinstance(post_body, dict): - head["Content-Type"] = "application/json" - post_body = json.dumps(post_body) - else: + if isinstance(post_body, dict): + head["Content-Type"] = "application/json" + post_body = json.dumps(post_body) + else: head["Content-Type"] = "application/x-www-form-urlencoded" - log.debug("Content-Type: {0}", head["Content-Type"]) - log.debug("POST DATA: {0}", post_body) + log.debug("Content-Type: {0}".format(head["Content-Type"])) + log.debug("POST DATA: {0}".format(post_body)) data = http_request(url, data=post_body, headers=head) else: data = http_request(url, headers=head) - log.debug("HTTP response: {0} {1}", data.status_code, data.content) - log.debug("{0} URL HEADERS: {1}", method, data.headers) + #import web_pdb; web_pdb.set_trace() + #log.debug("HTTP response: {0} {1}".format(data.status_code, data.content)) + log.debug("{0} URL HEADERS: {1}".format(method, data.headers)) if data.status_code == 200: if headers is not None and isinstance(headers, dict): headers.update(data.headers) - log.debug("Data Length: {0}", len(data.content)) + log.debug("Data Length: {0}".format(len(data.content))) log.debug("====== 200 returned =======") - log.debug("Content-Type: {0}", data.headers.get("content-type")) - log.debug("{0}", str(data.content)) + log.debug("Content-Type: {0}".format(data.headers.get("content-type"))) + log.debug("{0}".format(data.json())) log.debug("====== 200 finished ======") elif data.status_code >= 400: @@ -741,20 +743,20 @@ class DownloadUtils: m = hashlib.md5() m.update(username) hashed_username = m.hexdigest() - log.error("HTTP response error 401 auth error, removing any saved passwords for user: {0}", hashed_username) + log.error("HTTP response error 401 auth error, removing any saved passwords for user: {0}".format(hashed_username)) settings.setSetting("saved_user_password_" + hashed_username, "") save_user_details(settings, "", "") - log.error("HTTP response error: {0} {1}", data.status_code, data.content) + log.error("HTTP response error: {0} {1}".format(data.status_code, data.content)) if suppress is False: xbmcgui.Dialog().notification(string_load(30316), string_load(30200) % str(data.content), icon="special://home/addons/plugin.video.jellycon/icon.png") return data.content or "null" except Exception as msg: - log.error("{0}", format_exc()) - log.error("Unable to connect to {0} : {1}", server, msg) + log.error("{0}".format(format_exc())) + log.error("Unable to connect to {0} : {1}".format(server, msg)) if not suppress: xbmcgui.Dialog().notification(string_load(30316), str(msg), - icon="special://home/addons/plugin.video.jellycon/icon.png") \ No newline at end of file + icon="special://home/addons/plugin.video.jellycon/icon.png") diff --git a/resources/lib/filelock.py b/resources/lib/filelock.py index 7cc0fba..ffe5c68 100644 --- a/resources/lib/filelock.py +++ b/resources/lib/filelock.py @@ -90,10 +90,6 @@ import sys import time import errno -# from .simple_logging import SimpleLogging -# log = SimpleLogging(__name__) - - class FileLock(object): """ A file locking mechanism that has context-manager support so you can use it in a ``with`` statement. This should be relatively cross @@ -201,7 +197,7 @@ if __name__ == "__main__": import threading import tempfile from builtins import range - + temp_dir = tempfile.mkdtemp() protected_filepath = os.path.join(temp_dir, "somefile.txt") @@ -236,4 +232,4 @@ if __name__ == "__main__": # Please manually inspect the output. Does it look like the operations were atomic? with open(protected_filepath, "r") as f: sys.stdout.write(f.read()) -""" \ No newline at end of file +""" diff --git a/resources/lib/functions.py b/resources/lib/functions.py index cca5098..b6d9548 100644 --- a/resources/lib/functions.py +++ b/resources/lib/functions.py @@ -20,7 +20,7 @@ from .kodi_utils import HomeWindow from .clientinfo import ClientInformation from .datamanager import DataManager, clear_cached_server_data from .server_detect import check_server, check_connection_speed -from .simple_logging import SimpleLogging +from .loghandler import LazyLogger from .menu_functions import display_main_menu, display_menu, show_movie_alpha_list, show_tvshow_alpha_list, show_genre_list, show_search, show_movie_pages from .translation import string_load from .server_sessions import show_server_sessions @@ -39,7 +39,7 @@ __addondir__ = xbmc.translatePath(__addon__.getAddonInfo('profile')) __cwd__ = __addon__.getAddonInfo('path') PLUGINPATH = xbmc.translatePath(os.path.join(__cwd__)) -log = SimpleLogging(__name__) +log = LazyLogger(__name__) kodi_version = int(xbmc.getInfoLabel('System.BuildVersion')[:2]) @@ -60,14 +60,14 @@ def main_entry_point(): pr = cProfile.Profile() pr.enable() - log.debug("Running Python: {0}", sys.version_info) - log.debug("Running JellyCon: {0}", ClientInformation().get_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) + log.debug("Running Python: {0}".format(sys.version_info)) + log.debug("Running JellyCon: {0}".format(ClientInformation().get_version())) + log.debug("Kodi BuildVersion: {0}".format(xbmc.getInfoLabel("System.BuildVersion"))) + log.debug("Kodi Version: {0}".format(kodi_version)) + log.debug("Script argument data: {0}".format(sys.argv)) params = get_params() - log.debug("Script params: {0}", params) + log.debug("Script params: {0}".format(params)) request_path = params.get("request_path", None) param_url = params.get('url', None) @@ -148,8 +148,8 @@ def main_entry_point(): else: log.info("Unable to find TV show parent ID.") else: - log.debug("JellyCon -> Mode: {0}", mode) - log.debug("JellyCon -> URL: {0}", param_url) + log.debug("JellyCon -> Mode: {0}".format(mode)) + log.debug("JellyCon -> URL: {0}".format(param_url)) if mode == "GET_CONTENT": get_content(param_url, params) @@ -189,7 +189,7 @@ def __get_parent_id_from(params): result = None show_provider_ids = params.get("show_ids") if show_provider_ids is not None: - log.debug("TV show providers IDs: {}", show_provider_ids) + log.debug("TV show providers IDs: {}".format(show_provider_ids)) get_show_url = "{server}/Users/{userid}/Items?fields=MediaStreams&Recursive=true" \ "&IncludeItemTypes=series&IncludeMedia=true&ImageTypeLimit=1&Limit=16" \ "&AnyProviderIdEquals=" + show_provider_ids @@ -198,21 +198,21 @@ def __get_parent_id_from(params): if len(show) == 1: result = content.get("Items")[0].get("Id") else: - log.debug("TV show not found for ids: {}", show_provider_ids) + log.debug("TV show not found for ids: {}".format(show_provider_ids)) else: log.error("TV show parameter not found in request.") return result def toggle_watched(params): - log.debug("toggle_watched: {0}", params) + log.debug("toggle_watched: {0}".format(params)) item_id = params.get("item_id", None) if item_id is None: return url = "{server}/Users/{userid}/Items/" + item_id + "?format=json" data_manager = DataManager() result = data_manager.get_content(url) - log.debug("toggle_watched item info: {0}", result) + log.debug("toggle_watched item info: {0}".format(result)) user_data = result.get("UserData", None) if user_data is None: @@ -225,35 +225,35 @@ def toggle_watched(params): def mark_item_watched(item_id): - log.debug("Mark Item Watched: {0}", item_id) + log.debug("Mark Item Watched: {0}".format(item_id)) url = "{server}/Users/{userid}/PlayedItems/" + item_id downloadUtils.download_url(url, post_body="", method="POST") check_for_new_content() home_window = HomeWindow() last_url = home_window.get_property("last_content_url") if last_url: - log.debug("markWatched_lastUrl: {0}", last_url) + log.debug("markWatched_lastUrl: {0}".format(last_url)) home_window.set_property("skip_cache_for_" + last_url, "true") xbmc.executebuiltin("Container.Refresh") def mark_item_unwatched(item_id): - log.debug("Mark Item UnWatched: {0}", item_id) + log.debug("Mark Item UnWatched: {0}".format(item_id)) url = "{server}/Users/{userid}/PlayedItems/" + item_id downloadUtils.download_url(url, method="DELETE") check_for_new_content() home_window = HomeWindow() last_url = home_window.get_property("last_content_url") if last_url: - log.debug("markUnwatched_lastUrl: {0}", last_url) + log.debug("markUnwatched_lastUrl: {0}".format(last_url)) home_window.set_property("skip_cache_for_" + last_url, "true") xbmc.executebuiltin("Container.Refresh") def mark_item_favorite(item_id): - log.debug("Add item to favourites: {0}", item_id) + log.debug("Add item to favourites: {0}".format(item_id)) url = "{server}/Users/{userid}/FavoriteItems/" + item_id downloadUtils.download_url(url, post_body="", method="POST") check_for_new_content() @@ -266,7 +266,7 @@ def mark_item_favorite(item_id): def unmark_item_favorite(item_id): - log.debug("Remove item from favourites: {0}", item_id) + log.debug("Remove item from favourites: {0}".format(item_id)) url = "{server}/Users/{userid}/FavoriteItems/" + item_id downloadUtils.download_url(url, method="DELETE") check_for_new_content() @@ -304,7 +304,7 @@ def delete(item_id): return_value = xbmcgui.Dialog().yesno(string_load(30091), final_name, string_load(30092)) if return_value: - log.debug('Deleting Item: {0}', item_id) + log.debug('Deleting Item: {0}'.format(item_id)) url = '{server}/Items/' + item_id progress = xbmcgui.DialogProgress() progress.create(string_load(30052), string_load(30053)) @@ -324,8 +324,8 @@ def get_params(): plugin_path = sys.argv[0] paramstring = sys.argv[2] - log.debug("Parameter string: {0}", paramstring) - log.debug("Plugin Path string: {0}", plugin_path) + log.debug("Parameter string: {0}".format(paramstring)) + log.debug("Plugin Path string: {0}".format(plugin_path)) param = {} @@ -348,12 +348,12 @@ def get_params(): elif (len(splitparams)) == 3: param[splitparams[0]] = splitparams[1] + "=" + splitparams[2] - log.debug("JellyCon -> Detected parameters: {0}", param) + log.debug("JellyCon -> Detected parameters: {0}".format(param)) return param def show_menu(params): - log.debug("showMenu(): {0}", params) + log.debug("showMenu(): {0}".format(params)) home_window = HomeWindow() settings = xbmcaddon.Addon() @@ -362,7 +362,7 @@ def show_menu(params): url = "{server}/Users/{userid}/Items/" + item_id + "?format=json" data_manager = DataManager() result = data_manager.get_content(url) - log.debug("Menu item info: {0}", result) + log.debug("Menu item info: {0}".format(result)) if result is None: return @@ -466,7 +466,7 @@ def show_menu(params): view_key = "view-" + container_content_type current_default_view = settings.getSetting(view_key) view_match = container_view_id == current_default_view - log.debug("View ID:{0} Content type:{1}", container_view_id, container_content_type) + log.debug("View ID:{0} Content type:{1}".format(container_view_id, container_content_type)) if container_content_type in ["movies", "tvshows", "seasons", "episodes", "sets"]: if view_match: @@ -487,7 +487,7 @@ def show_menu(params): selected_action = "" if selected_action_item is not None: selected_action = selected_action_item.getProperty('menu_id') - log.debug("Menu Action Selected: {0}", selected_action) + log.debug("Menu Action Selected: {0}".format(selected_action)) del action_menu if selected_action == "play": @@ -498,11 +498,11 @@ def show_menu(params): play_action(params) elif selected_action == "set_view": - log.debug("Settign view type for {0} to {1}", view_key, container_view_id) + log.debug("Settign view type for {0} to {1}".format(view_key, container_view_id)) settings.setSetting(view_key, container_view_id) elif selected_action == "unset_view": - log.debug("Un-Settign view type for {0} to {1}", view_key, container_view_id) + log.debug("Un-Settign view type for {0} to {1}".format(view_key, container_view_id)) settings.setSetting(view_key, "") elif selected_action == "refresh_server": @@ -513,7 +513,7 @@ def show_menu(params): "&ReplaceAllImages=true" + "&ReplaceAllMetadata=true") res = downloadUtils.download_url(url, post_body="", method="POST") - log.debug("Refresh Server Responce: {0}", res) + log.debug("Refresh Server Responce: {0}".format(res)) elif selected_action == "hide": user_details = load_user_details(settings) @@ -522,13 +522,13 @@ def show_menu(params): url = "{server}/Items/" + item_id + "/Tags/Add" post_tag_data = {"Tags": [{"Name": hide_tag_string}]} res = downloadUtils.download_url(url, post_body=post_tag_data, method="POST") - log.debug("Add Tag Responce: {0}", res) + log.debug("Add Tag Responce: {0}".format(res)) check_for_new_content() last_url = home_window.get_property("last_content_url") if last_url: - log.debug("markUnwatched_lastUrl: {0}", last_url) + log.debug("markUnwatched_lastUrl: {0}".format(last_url)) home_window.set_property("skip_cache_for_" + last_url, "true") xbmc.executebuiltin("Container.Refresh") @@ -549,7 +549,7 @@ def show_menu(params): bitrate_dialog.doModal() selected_transcode_value = bitrate_dialog.selected_transcode_value del bitrate_dialog - log.debug("selected_transcode_value: {0}", selected_transcode_value) + log.debug("selected_transcode_value: {0}".format(selected_transcode_value)) if selected_transcode_value > 0: settings.setSetting("force_max_stream_bitrate", str(selected_transcode_value)) @@ -581,7 +581,7 @@ def show_menu(params): result = json.loads(delete_action) dialog = xbmcgui.Dialog() if result: - log.debug("Safe_Delete_Action: {0}", result) + log.debug("Safe_Delete_Action: {0}".format(result)) action_token = result["action_token"] message = "You are about to delete the following item[CR][CR]" @@ -611,7 +611,7 @@ def show_menu(params): confirm_dialog.message = message confirm_dialog.heading = "Confirm delete files?" confirm_dialog.doModal() - log.debug("safe_delete_confirm_dialog: {0}", confirm_dialog.confirm) + log.debug("safe_delete_confirm_dialog: {0}".format(confirm_dialog.confirm)) if confirm_dialog.confirm: url = "{server}/jellyfin_safe_delete/delete_item_action" @@ -620,12 +620,12 @@ def show_menu(params): 'action_token': action_token } delete_action = downloadUtils.download_url(url, method="POST", post_body=playback_info) - log.debug("Delete result action: {0}", delete_action) + log.debug("Delete result action: {0}".format(delete_action)) delete_action_result = json.loads(delete_action) if not delete_action_result: - dialog.ok("Error", "Error deleteing files", "Error in responce from server") + dialog.ok("Error", "Error deleting files", "Error in responce from server") elif not delete_action_result["result"]: - dialog.ok("Error", "Error deleteing files", delete_action_result["message"]) + dialog.ok("Error", "Error deleting files", delete_action_result["message"]) else: dialog.ok("Deleted", "Files deleted") else: @@ -686,29 +686,12 @@ def show_menu(params): def populate_listitem(item_id): - log.debug("populate_listitem: {0}", item_id) + log.debug("populate_listitem: {0}".format(item_id)) url = "{server}/Users/{userid}/Items/" + item_id + "?format=json" json_data = downloadUtils.download_url(url) result = json.loads(json_data) - log.debug("populate_listitem item info: {0}", result) - - ''' - server = downloadUtils.getServer() - gui_options = {} - gui_options["server"] = server - - gui_options["name_format"] = None - gui_options["name_format_type"] = None - - 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: {0}", u) - - #list_item.setProperty('IsPlayable', 'false') - #list_item.setPath(u) - ''' + log.debug("populate_listitem item info: {0}".format(result)) item_title = result.get("Name", string_load(30280)) @@ -738,7 +721,7 @@ def populate_listitem(item_id): def show_content(params): - log.debug("showContent Called: {0}", params) + log.debug("showContent Called: {0}".format(params)) item_type = params.get("item_type") settings = xbmcaddon.Addon() @@ -760,7 +743,7 @@ def show_content(params): "&IsVirtualUnaired=false" + "&IncludeItemTypes=" + item_type) - log.debug("showContent Content Url: {0}", content_url) + log.debug("showContent Content Url: {0}".format(content_url)) get_content(content_url, params) @@ -776,28 +759,16 @@ def search_results_person(params): '&Fields={field_filters}' + '&format=json') - ''' - details_result = dataManager.GetContent(details_url) - log.debug("Search Results Details: {0}", details_result) - - if details_result: - items = details_result.get("Items") - found_types = set() - for item in items: - found_types.add(item.get("Type")) - log.debug("search_results_person found_types: {0}", found_types) - ''' - params["name_format"] = "Episode|episode_name_format" dir_items, detected_type, total_records = process_directory(details_url, None, params) - log.debug('search_results_person results: {0}', dir_items) - log.debug('search_results_person detect_type: {0}', detected_type) + log.debug('search_results_person results: {0}'.format(dir_items)) + log.debug('search_results_person detect_type: {0}'.format(detected_type)) if detected_type is not None: # if the media type is not set then try to use the detected type - log.debug("Detected content type: {0}", detected_type) + log.debug("Detected content type: {0}".format(detected_type)) content_type = None if detected_type == "Movie": @@ -825,9 +796,9 @@ def search_results(params): item_type = params.get('item_type') query_string = params.get('query') if query_string: - log.debug("query_string : {0}", query_string) + log.debug("query_string : {0}".format(query_string)) query_string = urllib.unquote(query_string) - log.debug("query_string : {0}", query_string) + log.debug("query_string : {0}".format(query_string)) item_type = item_type.lower() @@ -867,14 +838,14 @@ def search_results(params): return home_window.set_property("last_search", user_input) - log.debug('searchResults Called: {0}', params) + log.debug('searchResults Called: {0}'.format(params)) query = user_input else: query = query_string query = urllib.quote(query) - log.debug("query : {0}", query) + log.debug("query : {0}".format(query)) if (not item_type) or (not query): return @@ -904,7 +875,7 @@ def search_results(params): "&userId={userid}") person_search_results = dataManager.get_content(search_url) - log.debug("Person Search Result : {0}", person_search_results) + log.debug("Person Search Result : {0}".format(person_search_results)) if person_search_results is None: return @@ -967,23 +938,23 @@ def search_results(params): def play_action(params): log.debug("== ENTER: PLAY ==") - log.debug("PLAY ACTION PARAMS: {0}", params) + log.debug("PLAY ACTION PARAMS: {0}".format(params)) item_id = params.get("item_id") auto_resume = int(params.get("auto_resume", "-1")) - log.debug("AUTO_RESUME: {0}", auto_resume) + log.debug("AUTO_RESUME: {0}".format(auto_resume)) force_transcode = params.get("force_transcode", None) is not None - log.debug("FORCE_TRANSCODE: {0}", force_transcode) + log.debug("FORCE_TRANSCODE: {0}".format(force_transcode)) media_source_id = params.get("media_source_id", "") - log.debug("media_source_id: {0}", media_source_id) + log.debug("media_source_id: {0}".format(media_source_id)) subtitle_stream_index = params.get("subtitle_stream_index") - log.debug("subtitle_stream_index: {0}", subtitle_stream_index) + log.debug("subtitle_stream_index: {0}".format(subtitle_stream_index)) audio_stream_index = params.get("audio_stream_index") - log.debug("audio_stream_index: {0}", audio_stream_index) + log.debug("audio_stream_index: {0}".format(audio_stream_index)) action = params.get("action", "play") @@ -1001,7 +972,7 @@ def play_action(params): play_info["media_source_id"] = media_source_id play_info["subtitle_stream_index"] = subtitle_stream_index play_info["audio_stream_index"] = audio_stream_index - log.info("Sending jellycon_play_action : {0}", play_info) + log.info("Sending jellycon_play_action : {0}".format(play_info)) send_event_notification("jellycon_play_action", play_info) @@ -1016,7 +987,7 @@ def play_item_trailer(item_id): if result is None: return - log.debug("LocalTrailers {0}", result) + log.debug("LocalTrailers {0}".format(result)) count = 1 trailer_names = [] @@ -1037,7 +1008,7 @@ def play_item_trailer(item_id): url = ("{server}/Users/{userid}/Items/%s?format=json&Fields=RemoteTrailers" % item_id) json_data = downloadUtils.download_url(url) result = json.loads(json_data) - log.debug("RemoteTrailers: {0}", result) + log.debug("RemoteTrailers: {0}".format(result)) count = 1 if result is None: @@ -1058,7 +1029,7 @@ def play_item_trailer(item_id): trailer_names.append(name) trailer_list.append(info) - log.debug("TrailerList: {0}", trailer_list) + log.debug("TrailerList: {0}".format(trailer_list)) trailer_text = [] for trailer in trailer_list: @@ -1069,7 +1040,7 @@ def play_item_trailer(item_id): resp = dialog.select(string_load(30308), trailer_text) if resp > -1: trailer = trailer_list[resp] - log.debug("SelectedTrailer: {0}", trailer) + log.debug("SelectedTrailer: {0}".format(trailer)) if trailer.get("type") == "local": params = {} @@ -1079,7 +1050,7 @@ def play_item_trailer(item_id): elif trailer.get("type") == "remote": youtube_id = trailer.get("url").rsplit('=', 1)[1] youtube_plugin = "RunPlugin(plugin://plugin.video.youtube/play/?video_id=%s)" % youtube_id - log.debug("youtube_plugin: {0}", youtube_plugin) + log.debug("youtube_plugin: {0}".format(youtube_plugin)) # play_info = {} # play_info["url"] = youtube_plugin diff --git a/resources/lib/image_server.py b/resources/lib/image_server.py index e954f77..8783696 100644 --- a/resources/lib/image_server.py +++ b/resources/lib/image_server.py @@ -10,7 +10,7 @@ import requests import io from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer -from .simple_logging import SimpleLogging +from .loghandler import LazyLogger from .datamanager import DataManager from .downloadutils import DownloadUtils from .utils import get_art @@ -23,7 +23,7 @@ except Exception as err: pil_loaded = False PORT_NUMBER = 24276 -log = SimpleLogging(__name__) +log = LazyLogger(__name__) def get_image_links(url): @@ -77,7 +77,7 @@ def get_image_links(url): def build_image(path): log.debug("build_image()") - log.debug("Request Path : {0}", path) + log.debug("Request Path : {0}".format(path)) request_path = path[1:] @@ -85,7 +85,7 @@ def build_image(path): return [] decoded_url = base64.b64decode(request_path) - log.debug("decoded_url : {0}", decoded_url) + log.debug("decoded_url : {0}".format(decoded_url)) image_urls = get_image_links(decoded_url) @@ -115,7 +115,7 @@ def build_image(path): server = "%s:%s" % (host_name, port) url_full_path = url_path + "?" + url_query - log.debug("Loading image from : {0} {1} {2}", image_count, server, url_full_path) + log.debug("Loading image from : {0} {1} {2}".format(image_count, server, url_full_path)) try: image_response = requests.get(thumb_url) @@ -133,7 +133,7 @@ def build_image(path): del image_data except Exception as con_err: - log.debug("Error loading image : {0}", str(con_err)) + log.debug("Error loading image : {0}".format(con_err)) image_count += 1 diff --git a/resources/lib/item_functions.py b/resources/lib/item_functions.py index 44341a6..04d34f6 100644 --- a/resources/lib/item_functions.py +++ b/resources/lib/item_functions.py @@ -12,11 +12,11 @@ import xbmcaddon import xbmcgui from .utils import get_art, datetime_from_string -from .simple_logging import SimpleLogging +from .loghandler import LazyLogger from .downloadutils import DownloadUtils from .kodi_utils import HomeWindow -log = SimpleLogging(__name__) +log = LazyLogger(__name__) kodi_version = int(xbmc.getInfoLabel('System.BuildVersion')[:2]) addon_instance = xbmcaddon.Addon() @@ -176,7 +176,7 @@ def extract_item_info(item, gui_options): name_info["SeriesName"] = "" name_info["SeasonIndex"] = u"%02d" % item_details.season_number name_info["EpisodeIndex"] = u"%02d" % item_details.episode_number - log.debug("FormatName: {0} | {1}", name_format, name_info) + log.debug("FormatName: {0} | {1}".format(name_format, name_info)) item_details.name = unicode(name_format).format(**name_info).strip() year = item["ProductionYear"] diff --git a/resources/lib/kodi_utils.py b/resources/lib/kodi_utils.py index 5906311..78e466e 100644 --- a/resources/lib/kodi_utils.py +++ b/resources/lib/kodi_utils.py @@ -6,9 +6,9 @@ import xbmcaddon import sys import json -from .simple_logging import SimpleLogging +from .loghandler import LazyLogger -log = SimpleLogging(__name__) +log = LazyLogger(__name__) addon = xbmcaddon.Addon() @@ -59,9 +59,9 @@ def get_kodi_version(): result = result.get("result") version_data = result.get("version") version = float(str(version_data.get("major")) + "." + str(version_data.get("minor"))) - log.debug("Version: {0} - {1}", version, version_data) + log.debug("Version: {0} - {1}".format(version, version_data)) except: version = 0.0 - log.error("Version Error : RAW Version Data: {0}", result) + log.error("Version Error : RAW Version Data: {0}".format(result)) return version diff --git a/resources/lib/library_change_monitor.py b/resources/lib/library_change_monitor.py index d061614..75b0f62 100644 --- a/resources/lib/library_change_monitor.py +++ b/resources/lib/library_change_monitor.py @@ -3,11 +3,11 @@ import time import xbmc -from .simple_logging import SimpleLogging +from .loghandler import LazyLogger from .widgets import check_for_new_content from .tracking import timer -log = SimpleLogging(__name__) +log = LazyLogger(__name__) class LibraryChangeMonitor(threading.Thread): diff --git a/resources/lib/loghandler.py b/resources/lib/loghandler.py new file mode 100644 index 0000000..94d1824 --- /dev/null +++ b/resources/lib/loghandler.py @@ -0,0 +1,157 @@ +# -*- coding: utf-8 -*- +from __future__ import division, absolute_import, print_function, unicode_literals + +################################################################################################## + +import os +import logging +import sys +import traceback + +from six import ensure_text +from kodi_six import xbmc, xbmcaddon + +#from .utils import get_filesystem_encoding + +#from . import settings + +################################################################################################## + +__addon__ = xbmcaddon.Addon(id='plugin.video.jellycon') +__pluginpath__ = xbmc.translatePath(__addon__.getAddonInfo('path')) + +################################################################################################## + + +def getLogger(name=None): + if name is None: + return __LOGGER + + return __LOGGER.getChild(name) + + +class LogHandler(logging.StreamHandler): + + def __init__(self): + + logging.StreamHandler.__init__(self) + self.setFormatter(MyFormatter()) + + self.sensitive = {'Token': [], 'Server': []} + + #for server in database.get_credentials()['Servers']: + + # if server.get('AccessToken'): + # self.sensitive['Token'].append(server['AccessToken']) + + # if server.get('address'): + # self.sensitive['Server'].append(server['address'].split('://')[1]) + + #self.mask_info = settings('maskInfo.bool') + + def emit(self, record): + + if self._get_log_level(record.levelno): + string = self.format(record) + + #if self.mask_info: + # for server in self.sensitive['Server']: + # string = string.replace(server or "{server}", "{jellyfin-server}") + + # for token in self.sensitive['Token']: + # string = string.replace(token or "{token}", "{jellyfin-token}") + + xbmc.log(string, level=xbmc.LOGNOTICE) + + @classmethod + def _get_log_level(cls, level): + + levels = { + logging.ERROR: 0, + logging.WARNING: 0, + logging.INFO: 1, + logging.DEBUG: 2 + } + ### TODO + log_level = 2 + #try: + # log_level = int(settings('logLevel')) + #except ValueError: + # log_level = 2 # If getting settings fail, we probably want debug logging. + + return log_level >= levels[level] + + +class MyFormatter(logging.Formatter): + + def __init__(self, fmt='%(name)s -> %(levelname)s::%(relpath)s:%(lineno)s %(message)s'): + logging.Formatter.__init__(self, fmt) + + def format(self, record): + if record.pathname: + record.pathname = ensure_text(record.pathname, get_filesystem_encoding()) + + self._gen_rel_path(record) + + # Call the original formatter class to do the grunt work + result = logging.Formatter.format(self, record) + + return result + + def formatException(self, exc_info): + _pluginpath_real = os.path.realpath(__pluginpath__) + res = [] + + for o in traceback.format_exception(*exc_info): + o = ensure_text(o, get_filesystem_encoding()) + + if o.startswith(' File "'): + # If this split can't handle your file names, you should seriously consider renaming your files. + fn = o.split(' File "', 2)[1].split('", line ', 1)[0] + rfn = os.path.realpath(fn) + if rfn.startswith(_pluginpath_real): + o = o.replace(fn, os.path.relpath(rfn, _pluginpath_real)) + + res.append(o) + + return ''.join(res) + + def _gen_rel_path(self, record): + if record.pathname: + record.relpath = os.path.relpath(record.pathname, __pluginpath__) + + +class LazyLogger(object): + """`helper.loghandler.getLogger()` is used everywhere. + This class helps avoiding import errors. + """ + __logger = None + __logger_name = None + + def __init__(self, logger_name=None): + self.__logger_name = logger_name + + def __getattr__(self, name): + if self.__logger is None: + self.__logger = getLogger(self.__logger_name) + return getattr(self.__logger, name) + + +def get_filesystem_encoding(): + enc = sys.getfilesystemencoding() + + if not enc: + enc = sys.getdefaultencoding() + + if not enc or enc == 'ascii': + enc = 'utf-8' + + return enc + + +__LOGGER = logging.getLogger('JELLYFIN') +for handler in __LOGGER.handlers: + __LOGGER.removeHandler(handler) + +__LOGGER.addHandler(LogHandler()) +__LOGGER.setLevel(logging.DEBUG) diff --git a/resources/lib/menu_functions.py b/resources/lib/menu_functions.py index 91d0114..d980217 100644 --- a/resources/lib/menu_functions.py +++ b/resources/lib/menu_functions.py @@ -11,19 +11,19 @@ import xbmcaddon from .downloadutils import DownloadUtils from .kodi_utils import add_menu_directory_item, HomeWindow -from .simple_logging import SimpleLogging +from .loghandler import LazyLogger from .translation import string_load from .datamanager import DataManager from .utils import get_art, get_jellyfin_url -log = SimpleLogging(__name__) +log = LazyLogger(__name__) downloadUtils = DownloadUtils() __addon__ = xbmcaddon.Addon() def show_movie_tags(menu_params): - log.debug("show_movie_tags: {0}", menu_params) + log.debug("show_movie_tags: {0}".format(menu_params)) parent_id = menu_params.get("parent_id") url_params = {} @@ -50,7 +50,7 @@ def show_movie_tags(menu_params): tags = result.get("Items") - log.debug("Tags : {0}", result) + log.debug("Tags : {0}".format(result)) for tag in tags: name = tag["Name"] @@ -80,14 +80,14 @@ def show_movie_tags(menu_params): content_url + "&mode=GET_CONTENT" + "&media_type=movies") - log.debug("addMenuDirectoryItem: {0} - {1}", name, url) + log.debug("addMenuDirectoryItem: {0} - {1}".format(name, url)) add_menu_directory_item(name, url, art=art) xbmcplugin.endOfDirectory(int(sys.argv[1])) def show_movie_years(menu_params): - log.debug("show_movie_years: {0}", menu_params) + log.debug("show_movie_years: {0}".format(menu_params)) parent_id = menu_params.get("parent_id") group_into_decades = menu_params.get("group") == "true" @@ -166,14 +166,14 @@ def show_movie_years(menu_params): content_url + "&mode=GET_CONTENT" + "&media_type=movies") - log.debug("addMenuDirectoryItem: {0} - {1}", name, url) + log.debug("addMenuDirectoryItem: {0} - {1}".format(name, url)) add_menu_directory_item(name, url, art=art) xbmcplugin.endOfDirectory(int(sys.argv[1])) def show_movie_pages(menu_params): - log.debug("showMoviePages: {0}", menu_params) + log.debug("showMoviePages: {0}".format(menu_params)) parent_id = menu_params.get("parent_id") settings = xbmcaddon.Addon() @@ -199,7 +199,7 @@ def show_movie_pages(menu_params): return total_results = result.get("TotalRecordCount", 0) - log.debug("showMoviePages TotalRecordCount {0}", total_results) + log.debug("showMoviePages TotalRecordCount {0}".format(total_results)) if result == 0: return @@ -250,14 +250,14 @@ def show_movie_pages(menu_params): url = sys.argv[0] + ("?url=" + content_url + "&mode=GET_CONTENT" + "&media_type=" + collection["media_type"]) - log.debug("addMenuDirectoryItem: {0} - {1} - {2}", collection.get('title'), url, collection.get("art")) + log.debug("addMenuDirectoryItem: {0} - {1} - {2}".format(collection.get('title'), url, collection.get("art"))) add_menu_directory_item(collection.get('title', string_load(30250)), url, art=collection.get("art")) xbmcplugin.endOfDirectory(int(sys.argv[1])) def show_genre_list(menu_params): - log.debug("showGenreList: {0}", menu_params) + log.debug("showGenreList: {0}".format(menu_params)) server = downloadUtils.get_server() if server is None: @@ -331,7 +331,7 @@ def show_genre_list(menu_params): url = sys.argv[0] + ("?url=" + urllib.quote(collection['path']) + "&mode=GET_CONTENT" + "&media_type=" + collection["media_type"]) - log.debug("addMenuDirectoryItem: {0} - {1} - {2}", collection.get('title'), url, collection.get("art")) + log.debug("addMenuDirectoryItem: {0} - {1} - {2}".format(collection.get('title'), url, collection.get("art"))) add_menu_directory_item(collection.get('title', string_load(30250)), url, art=collection.get("art")) xbmcplugin.endOfDirectory(int(sys.argv[1])) @@ -407,7 +407,7 @@ def show_movie_alpha_list(menu_params): for collection in collections: url = (sys.argv[0] + "?url=" + urllib.quote(collection['path']) + "&mode=GET_CONTENT&media_type=" + collection["media_type"]) - log.debug("addMenuDirectoryItem: {0} ({1})", collection.get('title'), url) + log.debug("addMenuDirectoryItem: {0} ({1})".format(collection.get('title'), url)) add_menu_directory_item(collection.get('title', string_load(30250)), url, art=collection.get("art")) xbmcplugin.endOfDirectory(int(sys.argv[1])) @@ -477,7 +477,7 @@ def show_tvshow_alpha_list(menu_params): for collection in collections: url = (sys.argv[0] + "?url=" + urllib.quote(collection['path']) + "&mode=GET_CONTENT&media_type=" + collection["media_type"]) - log.debug("addMenuDirectoryItem: {0} ({1})", collection.get('title'), url) + log.debug("addMenuDirectoryItem: {0} ({1})".format(collection.get('title'), url)) add_menu_directory_item(collection.get('title', string_load(30250)), url, art=collection.get("art")) xbmcplugin.endOfDirectory(int(sys.argv[1])) @@ -1053,7 +1053,7 @@ def display_library_view(params): data_manager = DataManager() view_info = data_manager.get_content(view_info_url) - log.debug("VIEW_INFO : {0}", view_info) + log.debug("VIEW_INFO : {0}".format(view_info)) collection_type = view_info.get("CollectionType", None) @@ -1111,7 +1111,7 @@ def show_search(): def set_library_window_values(force=False): - log.debug("set_library_window_values Called forced={0}", force) + log.debug("set_library_window_values Called forced={0}".format(force)) home_window = HomeWindow() already_set = home_window.get_property("view_item.0.name") @@ -1145,19 +1145,19 @@ def set_library_window_values(force=False): # plugin.video.jellycon- prop_name = "view_item.%i.name" % index home_window.set_property(prop_name, name) - log.debug("set_library_window_values: plugin.video.jellycon-{0}={1}", prop_name, name) + log.debug("set_library_window_values: plugin.video.jellycon-{0}={1}".format(prop_name, name)) prop_name = "view_item.%i.id" % index home_window.set_property(prop_name, item_id) - log.debug("set_library_window_values: plugin.video.jellycon-{0}={1}", prop_name, item_id) + log.debug("set_library_window_values: plugin.video.jellycon-{0}={1}".format(prop_name, item_id)) prop_name = "view_item.%i.type" % index home_window.set_property(prop_name, collection_type) - log.debug("set_library_window_values: plugin.video.jellycon-{0}={1}", prop_name, collection_type) + log.debug("set_library_window_values: plugin.video.jellycon-{0}={1}".format(prop_name, collection_type)) thumb = downloadUtils.get_artwork(item, "Primary", server=server) prop_name = "view_item.%i.thumb" % index home_window.set_property(prop_name, thumb) - log.debug("set_library_window_values: plugin.video.jellycon-{0}={1}", prop_name, thumb) + log.debug("set_library_window_values: plugin.video.jellycon-{0}={1}".format(prop_name, thumb)) index += 1 diff --git a/resources/lib/picture_viewer.py b/resources/lib/picture_viewer.py index acf1171..58fdc6f 100644 --- a/resources/lib/picture_viewer.py +++ b/resources/lib/picture_viewer.py @@ -2,9 +2,9 @@ import xbmc import xbmcaddon import xbmcgui -from .simple_logging import SimpleLogging +from .loghandler import LazyLogger -log = SimpleLogging(__name__) +log = LazyLogger(__name__) class PictureViewer(xbmcgui.WindowXMLDialog): picture_url = None diff --git a/resources/lib/play_utils.py b/resources/lib/play_utils.py index 9567c81..e34a3ca 100644 --- a/resources/lib/play_utils.py +++ b/resources/lib/play_utils.py @@ -9,7 +9,7 @@ import json import os import base64 -from .simple_logging import SimpleLogging +from .loghandler import LazyLogger from .downloadutils import DownloadUtils from .resume_dialog import ResumeDialog from .utils import PlayUtils, get_art, send_event_notification, convert_size @@ -24,7 +24,7 @@ from .picture_viewer import PictureViewer from .tracking import timer from .playnext import PlayNextDialog -log = SimpleLogging(__name__) +log = LazyLogger(__name__) download_utils = DownloadUtils() @@ -60,7 +60,7 @@ def play_all_files(items, monitor, play_items=True): source_id = selected_media_source.get("Id") playurl, playback_type, listitem_props = PlayUtils().get_play_url(selected_media_source, play_session_id) - log.info("Play URL: {0} PlaybackType: {1} ListItem Properties: {2}", playurl, playback_type, listitem_props) + log.info("Play URL: {0} PlaybackType: {1} ListItem Properties: {2}".format(playurl, playback_type, listitem_props)) if playurl is None: return @@ -89,7 +89,7 @@ def play_all_files(items, monitor, play_items=True): data["play_session_id"] = play_session_id data["play_action_type"] = "play_all" monitor.played_information[playurl] = data - log.debug("Add to played_information: {0}", monitor.played_information) + log.debug("Add to played_information: {0}".format(monitor.played_information)) list_item.setPath(playurl) list_item = set_list_item_props(item_id, list_item, item, server, listitem_props, item_title) @@ -121,7 +121,7 @@ def play_list_of_items(id_list, monitor): def add_to_playlist(play_info, monitor): - log.debug("Adding item to playlist : {0}", play_info) + log.debug("Adding item to playlist : {0}".format(play_info)) playlist = xbmc.PlayList(xbmc.PLAYLIST_VIDEO) server = download_utils.get_server() @@ -159,7 +159,7 @@ def add_to_playlist(play_info, monitor): source_id = selected_media_source.get("Id") playurl, playback_type, listitem_props = PlayUtils().get_play_url(selected_media_source, play_session_id) - log.info("Play URL: {0} PlaybackType: {1} ListItem Properties: {2}", playurl, playback_type, listitem_props) + log.info("Play URL: {0} PlaybackType: {1} ListItem Properties: {2}".format(playurl, playback_type, listitem_props)) if playurl is None: return @@ -188,7 +188,7 @@ def add_to_playlist(play_info, monitor): data["play_session_id"] = play_session_id data["play_action_type"] = "play_all" monitor.played_information[playurl] = data - log.debug("Add to played_information: {0}", monitor.played_information) + log.debug("Add to played_information: {0}".format(monitor.played_information)) list_item.setPath(playurl) list_item = set_list_item_props(item_id, list_item, item, server, listitem_props, item_title) @@ -238,7 +238,7 @@ def play_file(play_info, monitor): subtitle_stream_index = play_info.get("subtitle_stream_index", None) audio_stream_index = play_info.get("audio_stream_index", None) - log.debug("playFile id({0}) resume({1}) force_transcode({2})", item_id, auto_resume, force_transcode) + log.debug("playFile id({0}) resume({1}) force_transcode({2})".format(item_id, auto_resume, force_transcode)) settings = xbmcaddon.Addon() addon_path = settings.getAddonInfo('path') @@ -251,7 +251,7 @@ def play_file(play_info, monitor): url = "{server}/Users/{userid}/Items/%s?format=json" % (item_id,) data_manager = DataManager() result = data_manager.get_content(url) - log.debug("Playfile item: {0}", result) + log.debug("Playfile item: {0}".format(result)) if result is None: log.debug("Playfile item was None, so can not play!") @@ -259,14 +259,14 @@ def play_file(play_info, monitor): # if this is a season, playlist or album then play all items in that parent if result.get("Type") in ["Season", "MusicAlbum", "Playlist"]: - log.debug("PlayAllFiles for parent item id: {0}", item_id) + log.debug("PlayAllFiles for parent item id: {0}".format(item_id)) url = ('{server}/Users/{userid}/items' + '?ParentId=%s' + '&Fields=MediaSources' + '&format=json') url = url % (item_id,) result = data_manager.get_content(url) - log.debug("PlayAllFiles items: {0}", result) + log.debug("PlayAllFiles items: {0}".format(result)) # process each item items = result["Items"] @@ -366,7 +366,7 @@ def play_file(play_info, monitor): resume_dialog.doModal() resume_result = resume_dialog.getResumeAction() del resume_dialog - log.debug("Resume Dialog Result: {0}", resume_result) + log.debug("Resume Dialog Result: {0}".format(resume_result)) # check system settings for play action # if prompt is set ask to set it to auto resume @@ -389,9 +389,9 @@ def play_file(play_info, monitor): elif resume_result == -1: return - log.debug("play_session_id: {0}", play_session_id) + log.debug("play_session_id: {0}".format(play_session_id)) playurl, playback_type, listitem_props = PlayUtils().get_play_url(selected_media_source, play_session_id) - log.info("Play URL: {0} Playback Type: {1} ListItem Properties: {2}", playurl, playback_type, listitem_props) + log.info("Play URL: {0} Playback Type: {1} ListItem Properties: {2}".format(playurl, playback_type, listitem_props)) if playurl is None: return @@ -431,7 +431,7 @@ def play_file(play_info, monitor): if playback_type == "2": # if transcoding then prompt for audio and subtitle playurl = audio_subs_pref(playurl, list_item, selected_media_source, item_id, audio_stream_index, subtitle_stream_index) - log.debug("New playurl for transcoding: {0}", playurl) + log.debug("New playurl for transcoding: {0}".format(playurl)) elif playback_type == "1": # for direct stream add any streamable subtitles external_subs(selected_media_source, list_item, item_id) @@ -446,7 +446,7 @@ def play_file(play_info, monitor): data["item_type"] = result.get("Type", None) data["can_delete"] = result.get("CanDelete", False) monitor.played_information[playurl] = data - log.debug("Add to played_information: {0}", monitor.played_information) + log.debug("Add to played_information: {0}".format(monitor.played_information)) list_item.setPath(playurl) list_item = set_list_item_props(item_id, list_item, result, server, listitem_props, item_title) @@ -488,12 +488,12 @@ def play_file(play_info, monitor): count = 0 max_loops = 2 * 120 while not monitor.abortRequested() and player.isPlaying() and count < max_loops: - log.info("PlaybackResumrAction : Seeking to : {0}", seek_to_time) + log.info("PlaybackResumrAction : Seeking to : {0}".format(seek_to_time)) player.seekTime(seek_to_time) current_position = player.getTime() if current_position >= target_seek: break - log.info("PlaybackResumrAction : target:{0} current:{1}", target_seek, current_position) + log.info("PlaybackResumrAction : target:{0} current:{1}".format(target_seek, current_position)) count = count + 1 xbmc.sleep(500) @@ -571,7 +571,7 @@ def get_next_episode(item): data_manager = DataManager() items_result = data_manager.get_content(url) - log.debug("get_next_episode, sibling list: {0}", items_result) + log.debug("get_next_episode, sibling list: {0}".format(items_result)) if items_result is None: log.debug("get_next_episode no results") @@ -583,7 +583,7 @@ def get_next_episode(item): index = item.get("IndexNumber", -1) # find the very next episode in the season if index == item_index + 1: - log.debug("get_next_episode, found next episode: {0}", item) + log.debug("get_next_episode, found next episode: {0}".format(item)) return item return None @@ -795,7 +795,7 @@ def audio_subs_pref(url, list_item, media_source, item_id, audio_stream_index, s if select_subs_index in downloadable_streams: subtitle_url = "%s/Videos/%s/%s/Subtitles/%s/Stream.srt" subtitle_url = subtitle_url % (download_utils.get_server(), item_id, source_id, select_subs_index) - log.debug("Streaming subtitles url: {0} {1}", select_subs_index, subtitle_url) + log.debug("Streaming subtitles url: {0} {1}".format(select_subs_index, subtitle_url)) list_item.setSubtitles([subtitle_url]) else: # Burn subtitles @@ -815,7 +815,7 @@ def audio_subs_pref(url, list_item, media_source, item_id, audio_stream_index, s if select_subs_index in downloadable_streams: subtitle_url = "%s/Videos/%s/%s/Subtitles/%s/Stream.srt" subtitle_url = subtitle_url % (download_utils.get_server(), item_id, source_id, select_subs_index) - log.debug("Streaming subtitles url: {0} {1}", select_subs_index, subtitle_url) + log.debug("Streaming subtitles url: {0} {1}".format(select_subs_index, subtitle_url)) list_item.setSubtitles([subtitle_url]) else: # Burn subtitles @@ -884,7 +884,7 @@ def external_subs(media_source, list_item, item_id): resp = xbmcgui.Dialog().select(string_load(30292), sub_names) if resp > -1: selected_sub = externalsubs[resp] - log.debug("External Subtitle Selected: {0}", selected_sub) + log.debug("External Subtitle Selected: {0}".format(selected_sub)) list_item.setSubtitles([selected_sub]) @@ -937,7 +937,7 @@ def send_progress(monitor): 'VolumeLevel': volume } - log.debug("Sending POST progress started: {0}", postdata) + log.debug("Sending POST progress started: {0}".format(postdata)) url = "{server}/Sessions/Playing/Progress" download_utils.download_url(url, post_body=postdata, method="POST") @@ -955,7 +955,7 @@ def get_volume(): def prompt_for_stop_actions(item_id, data): - log.debug("prompt_for_stop_actions Called : {0}", data) + log.debug("prompt_for_stop_actions Called : {0}".format(data)) settings = xbmcaddon.Addon() current_position = data.get("currentPossition", 0) @@ -986,7 +986,7 @@ def prompt_for_stop_actions(item_id, data): # item percentage complete # percenatge_complete = int(((current_position * 10000000) / runtime) * 100) percenatge_complete = int((current_position / duration) * 100) - log.debug("Episode Percentage Complete: {0}", percenatge_complete) + log.debug("Episode Percentage Complete: {0}".format(percenatge_complete)) if (can_delete and prompt_delete_episode_percentage < 100 and @@ -1047,12 +1047,12 @@ def prompt_for_stop_actions(item_id, data): def stop_all_playback(played_information): - log.debug("stop_all_playback : {0}", played_information) + log.debug("stop_all_playback : {0}".format(played_information)) if len(played_information) == 0: return - log.debug("played_information: {0}", played_information) + log.debug("played_information: {0}".format(played_information)) home_screen = HomeWindow() home_screen.clear_property("currently_playing_id") @@ -1060,8 +1060,8 @@ def stop_all_playback(played_information): for item_url in played_information: data = played_information.get(item_url) if data.get("currently_playing", False) is True: - log.debug("item_url: {0}", item_url) - log.debug("item_data: {0}", data) + log.debug("item_url: {0}".format(item_url)) + log.debug("item_data: {0}".format(data)) current_position = data.get("currentPossition", 0) duration = data.get("duration", 0) @@ -1070,7 +1070,7 @@ def stop_all_playback(played_information): play_session_id = data.get("play_session_id") if jellyfin_item_id is not None and current_position >= 0: - log.debug("Playback Stopped at: {0}", current_position) + log.debug("Playback Stopped at: {0}".format(current_position)) url = "{server}/Sessions/Playing/Stopped" postdata = { @@ -1095,12 +1095,12 @@ def get_playing_data(play_data_map): try: playing_file = xbmc.Player().getPlayingFile() except Exception as e: - log.error("get_playing_data : getPlayingFile() : {0}", e) + log.error("get_playing_data : getPlayingFile() : {0}".format(e)) return None - log.debug("get_playing_data : getPlayingFile() : {0}", playing_file) + log.debug("get_playing_data : getPlayingFile() : {0}".format(playing_file)) if playing_file not in play_data_map: infolabel_path_and_file = xbmc.getInfoLabel("Player.Filenameandpath") - log.debug("get_playing_data : Filenameandpath : {0}", infolabel_path_and_file) + log.debug("get_playing_data : Filenameandpath : {0}".format(infolabel_path_and_file)) if infolabel_path_and_file not in play_data_map: log.debug("get_playing_data : play data not found") return None @@ -1113,7 +1113,7 @@ def get_playing_data(play_data_map): class Service(xbmc.Player): def __init__(self, *args): - log.debug("Starting monitor service: {0}", args) + log.debug("Starting monitor service: {0}".format(args)) self.played_information = {} def onPlayBackStarted(self): @@ -1151,7 +1151,7 @@ class Service(xbmc.Player): 'PlaySessionId': play_session_id } - log.debug("Sending POST play started: {0}", postdata) + log.debug("Sending POST play started: {0}".format(postdata)) url = "{server}/Sessions/Playing" download_utils.download_url(url, post_body=postdata, method="POST") @@ -1202,7 +1202,7 @@ class PlaybackService(xbmc.Monitor): self.monitor = monitor def onNotification(self, sender, method, data): - log.debug("PlaybackService:onNotification:{0}:{1}:{2}", sender, method, data) + log.debug("PlaybackService:onNotification:{0}:{1}:{2}".format(sender, method, data)) if method == 'GUI.OnScreensaverActivated': self.screensaver_activated() @@ -1221,20 +1221,20 @@ class PlaybackService(xbmc.Monitor): data_json = json.loads(data) message_data = data_json[0] - log.debug("PlaybackService:onNotification:{0}", message_data) + log.debug("PlaybackService:onNotification:{0}".format(message_data)) decoded_data = base64.b64decode(message_data) play_info = json.loads(decoded_data) if signal == "jellycon_play_action": - log.info("Received jellycon_play_action : {0}", play_info) + log.info("Received jellycon_play_action : {0}".format(play_info)) play_file(play_info, self.monitor) elif signal == "jellycon_play_youtube_trailer_action": - log.info("Received jellycon_play_trailer_action : {0}", play_info) + log.info("Received jellycon_play_trailer_action : {0}".format(play_info)) trailer_link = play_info["url"] xbmc.executebuiltin(trailer_link) elif signal == "set_view": view_id = play_info["view_id"] - log.debug("Setting view id: {0}", view_id) + log.debug("Setting view id: {0}".format(view_id)) xbmc.executebuiltin("Container.SetViewMode(%s)" % int(view_id)) def screensaver_activated(self): diff --git a/resources/lib/playnext.py b/resources/lib/playnext.py index 60d6198..f858e0f 100644 --- a/resources/lib/playnext.py +++ b/resources/lib/playnext.py @@ -5,10 +5,10 @@ import xbmc import xbmcgui import xbmcaddon -from .simple_logging import SimpleLogging +from .loghandler import LazyLogger from .play_utils import send_event_notification -log = SimpleLogging(__name__) +log = LazyLogger(__name__) class PlayNextService(threading.Thread): @@ -38,7 +38,7 @@ class PlayNextService(threading.Thread): if not is_playing: settings = xbmcaddon.Addon() play_next_trigger_time = int(settings.getSetting('play_next_trigger_time')) - log.debug("New play_next_trigger_time value: {0}", play_next_trigger_time) + log.debug("New play_next_trigger_time value: {0}".format(play_next_trigger_time)) duration = player.getTotalTime() position = player.getTime() @@ -47,10 +47,10 @@ class PlayNextService(threading.Thread): if not play_next_triggered and (trigger_time > time_to_end) and play_next_dialog is None: play_next_triggered = True - log.debug("play_next_triggered hit at {0} seconds from end", time_to_end) + log.debug("play_next_triggered hit at {0} seconds from end".format(time_to_end)) play_data = get_playing_data(self.monitor.played_information) - log.debug("play_next_triggered play_data : {0}", play_data) + log.debug("play_next_triggered play_data : {0}".format(play_data)) next_episode = play_data.get("next_episode") item_type = play_data.get("item_type") @@ -116,7 +116,7 @@ class PlayNextDialog(xbmcgui.WindowXMLDialog): pass def onMessage(self, message): - log.debug("PlayNextDialog: onMessage: {0}", message) + log.debug("PlayNextDialog: onMessage: {0}".format(message)) def onAction(self, action): @@ -125,7 +125,7 @@ class PlayNextDialog(xbmcgui.WindowXMLDialog): elif action.getId() == 92: # ACTION_NAV_BACK self.close() else: - log.debug("PlayNextDialog: onAction: {0}", action.getId()) + log.debug("PlayNextDialog: onAction: {0}".format(action.getId())) def onClick(self, control_id): if control_id == 3013: @@ -133,7 +133,7 @@ class PlayNextDialog(xbmcgui.WindowXMLDialog): self.play_called self.close() next_item_id = self.episode_info.get("Id") - log.debug("Playing Next Episode: {0}", next_item_id) + log.debug("Playing Next Episode: {0}".format(next_item_id)) play_info = {} play_info["item_id"] = next_item_id play_info["auto_resume"] = "-1" diff --git a/resources/lib/resume_dialog.py b/resources/lib/resume_dialog.py index aad6521..2bb31e6 100644 --- a/resources/lib/resume_dialog.py +++ b/resources/lib/resume_dialog.py @@ -2,10 +2,10 @@ import xbmcgui -from .simple_logging import SimpleLogging +from .loghandler import LazyLogger from .translation import string_load -log = SimpleLogging(__name__) +log = LazyLogger(__name__) class ResumeDialog(xbmcgui.WindowXMLDialog): diff --git a/resources/lib/safe_delete_dialog.py b/resources/lib/safe_delete_dialog.py index c74b227..046df1f 100644 --- a/resources/lib/safe_delete_dialog.py +++ b/resources/lib/safe_delete_dialog.py @@ -3,9 +3,9 @@ import xbmc import xbmcgui -from .simple_logging import SimpleLogging +from .loghandler import LazyLogger -log = SimpleLogging(__name__) +log = LazyLogger(__name__) class SafeDeleteDialog(xbmcgui.WindowXMLDialog): @@ -36,7 +36,7 @@ class SafeDeleteDialog(xbmcgui.WindowXMLDialog): pass def onMessage(self, message): - log.debug("SafeDeleteDialog: onMessage: {0}", message) + log.debug("SafeDeleteDialog: onMessage: {0}".format(message)) def onAction(self, action): @@ -45,7 +45,7 @@ class SafeDeleteDialog(xbmcgui.WindowXMLDialog): elif action.getId() == 92: # ACTION_NAV_BACK self.close() else: - log.debug("SafeDeleteDialog: onAction: {0}", action.getId()) + log.debug("SafeDeleteDialog: onAction: {0}".format(action.getId())) def onClick(self, controlID): if controlID == 1: diff --git a/resources/lib/server_detect.py b/resources/lib/server_detect.py index c1b53ef..0e2b8bd 100644 --- a/resources/lib/server_detect.py +++ b/resources/lib/server_detect.py @@ -15,12 +15,12 @@ import xbmc from .kodi_utils import HomeWindow from .downloadutils import DownloadUtils, save_user_details, load_user_details -from .simple_logging import SimpleLogging +from .loghandler import LazyLogger from .translation import string_load from .utils import datetime_from_string from .clientinfo import ClientInformation -log = SimpleLogging(__name__) +log = LazyLogger(__name__) __addon__ = xbmcaddon.Addon() __addon_name__ = __addon__.getAddonInfo('name') @@ -39,7 +39,7 @@ def check_connection_speed(): server = du.get_server() url = server + "/playback/bitratetest?size=%s" % test_data_size - + head = du.get_auth_header(True) head["User-Agent"] = "JellyCon-" + ClientInformation().get_version() @@ -57,7 +57,7 @@ def check_connection_speed(): start_time = time.time() log.debug("Starting Connection Speed Test") - + response = requests.get(url, **request_details) last_percentage_done = 0 @@ -70,7 +70,7 @@ def check_connection_speed(): progress_dialog.update(percentage_done) last_percentage_done = percentage_done else: - log.error("HTTP response error: {0} {1}", response.status_code, response.content) + log.error("HTTP response error: {0} {1}".format(response.status_code, response.content)) error_message = "HTTP response error: %s\n%s" % (response.status_code, response.content) xbmcgui.Dialog().ok("Speed Test Error", error_message) return -1 @@ -78,7 +78,7 @@ def check_connection_speed(): total_data_read_kbits = (total_data_read * 8) / 1000 total_time = time.time() - start_time speed = int(total_data_read_kbits / total_time) - log.debug("Finished Connection Speed Test, speed: {0} total_data: {1}, total_time: {2}", speed, total_data_read, total_time) + log.debug("Finished Connection Speed Test, speed: {0} total_data: {1}, total_time: {2}".format(speed, total_data_read, total_time)) progress_dialog.close() del progress_dialog @@ -101,7 +101,7 @@ def check_safe_delete_available(): json_data = du.download_url("{server}/Plugins") result = json.loads(json_data) if result is not None: - log.debug("Server Plugin List: {0}", result) + log.debug("Server Plugin List: {0}".format(result)) safe_delete_found = False for plugin in result: @@ -109,7 +109,7 @@ def check_safe_delete_available(): safe_delete_found = True break - log.debug("Safe Delete Plugin Available: {0}", safe_delete_found) + log.debug("Safe Delete Plugin Available: {0}".format(safe_delete_found)) home_window = HomeWindow() if safe_delete_found: home_window.set_property("safe_delete_plugin_available", "true") @@ -136,8 +136,8 @@ def get_server_details(): sock.setsockopt(socket.SOL_IP, socket.IP_MULTICAST_LOOP, 1) sock.setsockopt(socket.IPPROTO_IP, socket.SO_REUSEADDR, 1) - log.debug("MutliGroup: {0}", multi_group) - log.debug("Sending UDP Data: {0}", message) + log.debug("MutliGroup: {0}".format(multi_group)) + log.debug("Sending UDP Data: {0}".format(message)) progress = xbmcgui.DialogProgress() progress.create(__addon_name__ + " : " + string_load(30373)) @@ -158,11 +158,11 @@ def get_server_details(): except: break except Exception as e: - log.error("UPD Discovery Error: {0}", e) + log.error("UPD Discovery Error: {0}".format(e)) progress.close() - log.debug("Found Servers: {0}", servers) + log.debug("Found Servers: {0}".format(servers)) return servers @@ -225,10 +225,10 @@ def check_server(force=False, change_user=False, notify=False): else: xbmc.executebuiltin("ActivateWindow(Home)") return - + public_lookup_url = "%s/Users/Public?format=json" % (server_url) - log.debug("Testing_Url: {0}", public_lookup_url) + log.debug("Testing_Url: {0}".format(public_lookup_url)) progress = xbmcgui.DialogProgress() progress.create(__addon_name__ + " : " + string_load(30376)) progress.update(0, string_load(30377)) @@ -248,7 +248,7 @@ def check_server(force=False, change_user=False, notify=False): xbmc.executebuiltin("ActivateWindow(Home)") return - log.debug("Selected server: {0}", server_url) + log.debug("Selected server: {0}".format(server_url)) settings.setSetting("server_address", server_url) something_changed = True @@ -268,7 +268,7 @@ def check_server(force=False, change_user=False, notify=False): log.debug("Getting user list") json_data = du.download_url(server_url + "/Users/Public?format=json", authenticate=False) - log.debug("jsonData: {0}", json_data) + log.debug("jsonData: {0}".format(json_data)) try: result = json.loads(json_data) except: @@ -293,13 +293,13 @@ def check_server(force=False, change_user=False, notify=False): last_active = user.get("LastActivityDate") if last_active: last_active_date = datetime_from_string(last_active) - log.debug("LastActivityDate: {0}", last_active_date) + log.debug("LastActivityDate: {0}".format(last_active_date)) ago = datetime.now() - last_active_date - log.debug("LastActivityDate: {0}", ago) + log.debug("LastActivityDate: {0}".format(ago)) days = divmod(ago.seconds, 86400) hours = divmod(days[1], 3600) minutes = divmod(hours[1], 60) - log.debug("LastActivityDate: {0} {1} {2}", days[0], hours[0], minutes[0]) + log.debug("LastActivityDate: {0} {1} {2}".format(days[0], hours[0], minutes[0])) if days[0]: time_ago += " %sd" % days[0] if hours[0]: @@ -311,7 +311,7 @@ def check_server(force=False, change_user=False, notify=False): time_ago = "Active: now" else: time_ago = "Active: %s ago" % time_ago - log.debug("LastActivityDate: {0}", time_ago) + log.debug("LastActivityDate: {0}".format(time_ago)) user_item = xbmcgui.ListItem(name) user_image = du.get_user_artwork(user, 'Primary') @@ -377,7 +377,7 @@ def check_server(force=False, change_user=False, notify=False): manual = selected_user.getProperty("manual") == "true" selected_user_name = selected_user.getLabel() - log.debug("Selected User Name: {0} : {1}", return_value, selected_user_name) + log.debug("Selected User Name: {0} : {1}".format(return_value, selected_user_name)) if manual: kb = xbmc.Keyboard() @@ -387,7 +387,7 @@ def check_server(force=False, change_user=False, notify=False): kb.doModal() if kb.isConfirmed(): selected_user_name = kb.getText() - log.debug("Manual entered username: {0}", selected_user_name) + log.debug("Manual entered username: {0}".format(selected_user_name)) else: return @@ -406,8 +406,8 @@ def check_server(force=False, change_user=False, notify=False): settings.setSetting("saved_user_password_" + hashed_username, "") if saved_password: - log.debug("Saving username and password: {0}", selected_user_name) - log.debug("Using stored password for user: {0}", hashed_username) + log.debug("Saving username and password: {0}".format(selected_user_name)) + log.debug("Using stored password for user: {0}".format(hashed_username)) save_user_details(settings, selected_user_name, saved_password) else: @@ -416,17 +416,17 @@ def check_server(force=False, change_user=False, notify=False): kb.setHiddenInput(True) kb.doModal() if kb.isConfirmed(): - log.debug("Saving username and password: {0}", selected_user_name) + log.debug("Saving username and password: {0}".format(selected_user_name)) save_user_details(settings, selected_user_name, kb.getText()) # should we save the password if allow_password_saving: save_password = xbmcgui.Dialog().yesno(string_load(30363), string_load(30364)) if save_password: - log.debug("Saving password for fast user switching: {0}", hashed_username) + log.debug("Saving password for fast user switching: {0}".format(hashed_username)) settings.setSetting("saved_user_password_" + hashed_username, kb.getText()) else: - log.debug("Saving username with no password: {0}", selected_user_name) + log.debug("Saving username with no password: {0}".format(selected_user_name)) save_user_details(settings, selected_user_name, "") if something_changed: diff --git a/resources/lib/server_sessions.py b/resources/lib/server_sessions.py index aa9fcab..9d8d81f 100644 --- a/resources/lib/server_sessions.py +++ b/resources/lib/server_sessions.py @@ -5,11 +5,11 @@ import xbmcgui import xbmcplugin from .downloadutils import DownloadUtils -from .simple_logging import SimpleLogging +from .loghandler import LazyLogger from .utils import get_art from .datamanager import DataManager -log = SimpleLogging(__name__) +log = LazyLogger(__name__) def show_server_sessions(): @@ -29,7 +29,7 @@ def show_server_sessions(): url = "{server}/Sessions" results = data_manager.get_content(url) - log.debug("session_info: {0}", results) + log.debug("session_info: {0}".format(results)) if results is None: return diff --git a/resources/lib/simple_logging.py b/resources/lib/simple_logging.py deleted file mode 100644 index d15a48b..0000000 --- a/resources/lib/simple_logging.py +++ /dev/null @@ -1,51 +0,0 @@ -# Gnu General Public License - see LICENSE.TXT - -import xbmc -import xbmcaddon -from .jsonrpc import JsonRpc - - -class SimpleLogging: - name = "" - enable_logging = False - - def __init__(self, name): - settings = xbmcaddon.Addon() - prefix = settings.getAddonInfo('name') - self.name = prefix + '.' + name - self.enable_logging = settings.getSetting('log_debug') == "true" - - # params = {"setting": "debug.showloginfo"} - # setting_result = json_rpc('Settings.getSettingValue').execute(params) - # 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) - - def __str__(self): - return "LoggingEnabled: " + str(self.enable_logging) - - def info(self, fmt, *args, **kwargs): - log_line = self.name + "|INFO|" + self.log_line(fmt, *args) - xbmc.log(log_line, level=xbmc.LOGNOTICE) - - def error(self, fmt, *args, **kwargs): - log_line = self.name + "|ERROR|" + self.log_line(fmt, *args) - xbmc.log(log_line, level=xbmc.LOGERROR) - - def debug(self, fmt, *args, **kwargs): - if self.enable_logging: - log_line = self.name + "|DEBUG|" + self.log_line(fmt, *args) - xbmc.log(log_line, level=xbmc.LOGNOTICE) - - @staticmethod - def log_line(fmt, *args): - new_args = [] - # convert any unicode to utf-8 strings - for arg in args: - if isinstance(arg, unicode): - new_args.append(arg.encode("utf-8")) - else: - new_args.append(arg) - log_line = fmt.format(*new_args) - return log_line diff --git a/resources/lib/skin_cloner.py b/resources/lib/skin_cloner.py index 738d6da..fb103fb 100644 --- a/resources/lib/skin_cloner.py +++ b/resources/lib/skin_cloner.py @@ -7,9 +7,9 @@ import xbmcgui import xbmcvfs from .jsonrpc import JsonRpc, get_value, set_value -from .simple_logging import SimpleLogging +from .loghandler import LazyLogger -log = SimpleLogging(__name__) +log = LazyLogger(__name__) ver = xbmc.getInfoLabel('System.BuildVersion')[:2] @@ -52,7 +52,7 @@ def clone_skin(): kodi_path = xbmc.translatePath("special://xbmc") kodi_skin_source = os.path.join(kodi_path, "addons", "skin.estuary") - log.debug("Kodi Skin Source: {0}", kodi_skin_source) + log.debug("Kodi Skin Source: {0}".format(kodi_skin_source)) pdialog = xbmcgui.DialogProgress() pdialog.create("JellyCon Skin Cloner", "") @@ -60,11 +60,11 @@ def clone_skin(): all_files = [] walk_path(kodi_skin_source, "", all_files) for found in all_files: - log.debug("Found Path: {0}", found) + log.debug("Found Path: {0}".format(found)) kodi_home_path = xbmc.translatePath("special://home") kodi_skin_destination = os.path.join(kodi_home_path, "addons", "skin.estuary_jellycon") - log.debug("Kodi Skin Destination: {0}", kodi_skin_destination) + log.debug("Kodi Skin Destination: {0}".format(kodi_skin_destination)) # copy all skin files (clone) count = 0 @@ -96,7 +96,7 @@ def clone_skin(): # get jellycon path jellycon_path = os.path.join(kodi_home_path, "addons", "plugin.video.jellycon") - log.debug("Major Version: {0}", ver) + log.debug("Major Version: {0}".format(ver)) file_list = ["Home.xml", "Includes_Home.xml", @@ -123,11 +123,11 @@ def clone_skin(): 'enabled': True } result = JsonRpc('Addons.SetAddonEnabled').execute(params) - log.debug("Addons.SetAddonEnabled : {0}", result) + log.debug("Addons.SetAddonEnabled : {0}".format(result)) log.debug("SkinCloner : Current Skin : " + get_value("lookandfeel.skin")) set_result = set_value("lookandfeel.skin", "skin.estuary_jellycon") - log.debug("Save Setting : lookandfeel.skin : {0}", set_result) + log.debug("Save Setting : lookandfeel.skin : {0}".format(set_result)) log.debug("SkinCloner : Current Skin : " + get_value("lookandfeel.skin")) diff --git a/resources/lib/tracking.py b/resources/lib/tracking.py index 19b6b65..285b547 100644 --- a/resources/lib/tracking.py +++ b/resources/lib/tracking.py @@ -3,9 +3,9 @@ import sys import functools import time -from .simple_logging import SimpleLogging +from .loghandler import LazyLogger -log = SimpleLogging(__name__) +log = LazyLogger(__name__) enabled = False @@ -27,6 +27,6 @@ def timer(func): data = args[1] elif func.__name__ == "main_entry_point" and len(sys.argv) > 2: data = sys.argv[2] - log.info("timing_data|{0}|{1}|{2}|{3}", func.__name__, started, ended, data) + log.info("timing_data|{0}|{1}|{2}|{3}".format(func.__name__, started, ended, data)) return value return wrapper diff --git a/resources/lib/trakttokodi.py b/resources/lib/trakttokodi.py index 63bb038..c90e448 100644 --- a/resources/lib/trakttokodi.py +++ b/resources/lib/trakttokodi.py @@ -6,12 +6,12 @@ import encodings import xbmc import xbmcgui -from .simple_logging import SimpleLogging +from .loghandler import LazyLogger from .datamanager import DataManager from .translation import string_load -log = SimpleLogging(__name__) +log = LazyLogger(__name__) dataManager = DataManager() details_string = 'EpisodeCount,SeasonCount,Path,Etag,MediaStreams' @@ -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: {0}', results) + log.debug('SearchHints jsonData: {0}'.format(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: {0}', potential_matches) + log.debug('Potential matches: {0}'.format(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: {0}', item) + log.debug('Found match: {0}'.format(item)) return item return None diff --git a/resources/lib/translation.py b/resources/lib/translation.py index 59faf89..319485e 100644 --- a/resources/lib/translation.py +++ b/resources/lib/translation.py @@ -1,7 +1,7 @@ import xbmcaddon -from .simple_logging import SimpleLogging +from .loghandler import LazyLogger -log = SimpleLogging(__name__) +log = LazyLogger(__name__) addon = xbmcaddon.Addon() diff --git a/resources/lib/utils.py b/resources/lib/utils.py index 111adb6..c567e69 100644 --- a/resources/lib/utils.py +++ b/resources/lib/utils.py @@ -15,7 +15,7 @@ import calendar import re from .downloadutils import DownloadUtils -from .simple_logging import SimpleLogging +from .loghandler import LazyLogger from .clientinfo import ClientInformation # hack to get datetime strptime loaded @@ -23,7 +23,7 @@ throwaway = time.strptime('20110101', '%Y%m%d') # define our global download utils downloadUtils = DownloadUtils() -log = SimpleLogging(__name__) +log = LazyLogger(__name__) def get_jellyfin_url(base_url, params): @@ -88,7 +88,7 @@ class PlayUtils: if direct_path.startswith("//"): direct_path = "smb://" + direct_path[2:] - log.debug("playback_direct_path: {0}", direct_path) + log.debug("playback_direct_path: {0}".format(direct_path)) if xbmcvfs.exists(direct_path): playurl = direct_path @@ -164,13 +164,13 @@ class PlayUtils: lines = contents.split(line_break) for line in lines: line = line.strip() - log.debug("STRM Line: {0}", line) + log.debug("STRM Line: {0}".format(line)) if line.startswith('#KODIPROP:'): match = re.search('#KODIPROP:(?P[^=]+?)=(?P.+)', line) if match: item_property = match.group('item_property') property_value = match.group('property_value') - log.debug("STRM property found: {0} value: {1}", item_property, property_value) + log.debug("STRM property found: {0} value: {1}".format(item_property, property_value)) listitem_props.append((item_property, property_value)) else: log.debug("STRM #KODIPROP incorrect format") @@ -181,7 +181,7 @@ class PlayUtils: playurl = line log.debug("STRM playback url found") - log.debug("Playback URL: {0} ListItem Properties: {1}", playurl, listitem_props) + log.debug("Playback URL: {0} ListItem Properties: {1}".format(playurl, listitem_props)) return playurl, listitem_props @@ -307,7 +307,7 @@ def send_event_notification(method, data): base64_data = base64.b64encode(message_data) escaped_data = '\\"[\\"{0}\\"]\\"'.format(base64_data) command = 'XBMC.NotifyAll({0}.SIGNAL,{1},{2})'.format(source_id, method, escaped_data) - log.debug("Sending notification event data: {0}", command) + log.debug("Sending notification event data: {0}".format(command)) xbmc.executebuiltin(command) @@ -317,7 +317,7 @@ def datetime_from_string(time_string): time_string = re.sub("[0-9]{1}Z", " UTC", time_string) elif time_string[-6:] == "+00:00": time_string = re.sub("[0-9]{1}\+00:00", " UTC", time_string) - log.debug("New Time String : {0}", time_string) + log.debug("New Time String : {0}".format(time_string)) start_time = time.strptime(time_string, "%Y-%m-%dT%H:%M:%S.%f %Z") dt = datetime(*(start_time[0:6])) diff --git a/resources/lib/websocket_client.py b/resources/lib/websocket_client.py index 8eae0de..71b0e08 100644 --- a/resources/lib/websocket_client.py +++ b/resources/lib/websocket_client.py @@ -10,13 +10,13 @@ import xbmc import xbmcgui from .functions import play_action -from .simple_logging import SimpleLogging +from .loghandler import LazyLogger from . import clientinfo from . import downloadutils from .jsonrpc import JsonRpc from .kodi_utils import HomeWindow -log = SimpleLogging(__name__) +log = LazyLogger(__name__) class WebSocketClient(threading.Thread): @@ -65,10 +65,10 @@ class WebSocketClient(threading.Thread): self._general_commands(data) else: - log.debug("WebSocket Message Type: {0}", message) + log.debug("WebSocket Message Type: {0}".format(message)) def _library_changed(self, data): - log.debug("Library_Changed: {0}", data) + log.debug("Library_Changed: {0}".format(data)) self._library_monitor.check_for_updates() def _play(self, data): @@ -81,7 +81,7 @@ class WebSocketClient(threading.Thread): home_screen.set_property("skip_select_user", "true") startat = data.get('StartPositionTicks', -1) - log.debug("WebSocket Message PlayNow: {0}", data) + log.debug("WebSocket Message PlayNow: {0}".format(data)) media_source_id = data.get("MediaSourceId", "") subtitle_stream_index = data.get("SubtitleStreamIndex", None) @@ -124,14 +124,14 @@ class WebSocketClient(threading.Thread): seek_to = data['SeekPositionTicks'] seek_time = seek_to / 10000000.0 player.seekTime(seek_time) - log.debug("Seek to {0}", seek_time) + log.debug("Seek to {0}".format(seek_time)) elif command in actions: actions[command]() - log.debug("Command: {0} completed", command) + log.debug("Command: {0} completed".format(command)) else: - log.debug("Unknown command: {0}", command) + log.debug("Unknown command: {0}".format(command)) return def _general_commands(self, data): @@ -175,7 +175,7 @@ class WebSocketClient(threading.Thread): # header = arguments['Header'] text = arguments['Text'] # show notification here - log.debug("WebSocket DisplayMessage: {0}", text) + log.debug("WebSocket DisplayMessage: {0}".format(text)) xbmcgui.Dialog().notification("JellyCon", text) elif command == 'SendString': @@ -234,7 +234,7 @@ class WebSocketClient(threading.Thread): self.post_capabilities() def on_error(self, ws, error): - log.debug("Error: {0}", error) + log.debug("Error: {0}".format(error)) def run(self): @@ -255,7 +255,7 @@ class WebSocketClient(threading.Thread): server = server.replace('http', "ws") websocket_url = "%s/websocket?api_key=%s&deviceId=%s" % (server, token, self.device_id) - log.debug("websocket url: {0}", websocket_url) + log.debug("websocket url: {0}".format(websocket_url)) self._client = websocket.WebSocketApp(websocket_url, on_open=self.on_open, diff --git a/resources/lib/widgets.py b/resources/lib/widgets.py index 616b9b1..c008a03 100644 --- a/resources/lib/widgets.py +++ b/resources/lib/widgets.py @@ -10,12 +10,12 @@ import time from .downloadutils import DownloadUtils from .utils import get_jellyfin_url from .datamanager import DataManager -from .simple_logging import SimpleLogging +from .loghandler import LazyLogger from .kodi_utils import HomeWindow from .dir_functions import process_directory from .tracking import timer -log = SimpleLogging(__name__) +log = LazyLogger(__name__) downloadUtils = DownloadUtils() dataManager = DataManager() kodi_version = int(xbmc.getInfoLabel('System.BuildVersion')[:2]) @@ -58,14 +58,14 @@ def set_random_movies(): m.update(movies_list_string) new_widget_hash = m.hexdigest() - log.debug("set_random_movies : {0}", movies_list_string) - log.debug("set_random_movies : {0}", new_widget_hash) + log.debug("set_random_movies : {0}".format(movies_list_string)) + log.debug("set_random_movies : {0}".format(new_widget_hash)) home_window.set_property("random-movies", movies_list_string) home_window.set_property("random-movies-changed", new_widget_hash) def set_background_image(force=False): - log.debug("set_background_image Called forced={0}", force) + log.debug("set_background_image Called forced={0}".format(force)) global background_current_item global background_items @@ -76,8 +76,8 @@ def set_background_image(force=False): background_items = [] if len(background_items) == 0: - log.debug("set_background_image: Need to load more backgrounds {0} - {1}", - len(background_items), background_current_item) + log.debug("set_background_image: Need to load more backgrounds {0} - {1}".format( + len(background_items), background_current_item)) url_params = {} url_params["Recursive"] = True @@ -105,12 +105,12 @@ def set_background_image(force=False): item_background["name"] = label background_items.append(item_background) - log.debug("set_background_image: Loaded {0} more backgrounds", len(background_items)) + log.debug("set_background_image: Loaded {0} more backgrounds".format(len(background_items))) if len(background_items) > 0: bg_image = background_items[background_current_item].get("image") label = background_items[background_current_item].get("name") - log.debug("set_background_image: {0} - {1} - {2}", background_current_item, label, bg_image) + log.debug("set_background_image: {0} - {1} - {2}".format(background_current_item, label, bg_image)) background_current_item += 1 if background_current_item >= len(background_items): @@ -133,7 +133,7 @@ def check_for_new_content(): log.debug("Using simple new content check") current_time_stamp = str(time.time()) home_window.set_property("jellycon_widget_reload", current_time_stamp) - log.debug("Setting New Widget Hash: {0}", current_time_stamp) + log.debug("Setting New Widget Hash: {0}".format(current_time_stamp)) return url_params = {} @@ -150,7 +150,7 @@ def check_for_new_content(): added_result = downloadUtils.download_url(added_url, suppress=True) result = json.loads(added_result) - log.debug("LATEST_ADDED_ITEM: {0}", result) + log.debug("LATEST_ADDED_ITEM: {0}".format(result)) last_added_date = "" if result is not None: @@ -158,7 +158,7 @@ def check_for_new_content(): if len(items) > 0: item = items[0] last_added_date = item.get("Etag", "") - log.debug("last_added_date: {0}", last_added_date) + log.debug("last_added_date: {0}".format(last_added_date)) url_params = {} url_params["Recursive"] = True @@ -174,7 +174,7 @@ def check_for_new_content(): played_result = downloadUtils.download_url(played_url, suppress=True) result = json.loads(played_result) - log.debug("LATEST_PLAYED_ITEM: {0}", result) + log.debug("LATEST_PLAYED_ITEM: {0}".format(result)) last_played_date = "" if result is not None: @@ -186,30 +186,30 @@ def check_for_new_content(): if user_data is not None: last_played_date = user_data.get("LastPlayedDate", "") - log.debug("last_played_date: {0}", last_played_date) + log.debug("last_played_date: {0}".format(last_played_date)) current_widget_hash = home_window.get_property("jellycon_widget_reload") - log.debug("Current Widget Hash: {0}", current_widget_hash) + log.debug("Current Widget Hash: {0}".format(current_widget_hash)) m = hashlib.md5() m.update(last_played_date + last_added_date) new_widget_hash = m.hexdigest() - log.debug("New Widget Hash: {0}", new_widget_hash) + log.debug("New Widget Hash: {0}".format(new_widget_hash)) if current_widget_hash != new_widget_hash: home_window.set_property("jellycon_widget_reload", new_widget_hash) - log.debug("Setting New Widget Hash: {0}", new_widget_hash) + log.debug("Setting New Widget Hash: {0}".format(new_widget_hash)) @timer def get_widget_content_cast(handle, params): - log.debug("getWigetContentCast Called: {0}", params) + log.debug("getWigetContentCast Called: {0}".format(params)) server = downloadUtils.get_server() item_id = params["id"] data_manager = DataManager() result = data_manager.get_content("{server}/Users/{userid}/Items/" + item_id + "?format=json") - log.debug("ItemInfo: {0}", result) + log.debug("ItemInfo: {0}".format(result)) if not result: return @@ -272,7 +272,7 @@ def get_widget_content_cast(handle, params): @timer def get_widget_content(handle, params): - log.debug("getWigetContent Called: {0}", params) + log.debug("getWigetContent Called: {0}".format(params)) settings = xbmcaddon.Addon() hide_watched = settings.getSetting("hide_watched") == "true" @@ -283,7 +283,7 @@ def get_widget_content(handle, params): log.error("getWigetContent type not set") return - log.debug("widget_type: {0}", widget_type) + log.debug("widget_type: {0}".format(widget_type)) url_verb = "{server}/Users/{userid}/Items" url_params = {} @@ -377,7 +377,7 @@ def get_widget_content(handle, params): set_id = 0 while len(ids) < 20 and suggested_items: items = suggested_items[set_id] - log.debug("BaselineItemName : {0} - {1}", set_id, items.get("BaselineItemName")) + log.debug("BaselineItemName : {0} - {1}".format(set_id, items.get("BaselineItemName"))) items = items["Items"] rand = random.randint(0, len(items) - 1) # log.debug("random suggestions index : {0} {1}", rand, set_id) @@ -397,7 +397,7 @@ def get_widget_content(handle, params): set_id = 0 id_list = ",".join(ids) - log.debug("Recommended Items : {0}", len(ids), id_list) + log.debug("Recommended Items : {0}".format(len(ids), id_list)) url_params["Ids"] = id_list items_url = get_jellyfin_url(url_verb, url_params) @@ -417,7 +417,7 @@ def get_widget_content(handle, params): if detected_type is not None: # if the media type is not set then try to use the detected type - log.debug("Detected content type: {0}", detected_type) + log.debug("Detected content type: {0}".format(detected_type)) content_type = None if detected_type == "Movie": diff --git a/service.py b/service.py index 2599cc6..ae3261e 100644 --- a/service.py +++ b/service.py @@ -9,7 +9,7 @@ import xbmcaddon import xbmcgui from resources.lib.downloadutils import DownloadUtils, save_user_details -from resources.lib.simple_logging import SimpleLogging +from resources.lib.loghandler import LazyLogger from resources.lib.play_utils import Service, PlaybackService, send_progress from resources.lib.kodi_utils import HomeWindow from resources.lib.widgets import set_background_image, set_random_movies @@ -35,13 +35,13 @@ home_window.clear_property("userid") home_window.clear_property("AccessToken") home_window.clear_property("Params") -log = SimpleLogging('service') +log = LazyLogger('service') monitor = xbmc.Monitor() try: clear_old_cache_data() except Exception as error: - log.error("Error in clear_old_cache_data() : {0}", error) + log.error("Error in clear_old_cache_data() : {0}".format(error)) # wait for 10 seconds for the Kodi splash screen to close i = 0 @@ -60,7 +60,7 @@ try: download_utils.authenticate() download_utils.get_user_id() except Exception as error: - log.error("Error with initial service auth: {0}", error) + log.error("Error with initial service auth: {0}".format(error)) image_server = HttpImageServerThread() @@ -181,8 +181,8 @@ while not xbmc.abortRequested: set_background_image(False) except Exception as error: - log.error("Exception in Playback Monitor: {0}", error) - log.error("{0}", traceback.format_exc()) + log.error("Exception in Playback Monitor: {0}".format(error)) + log.error("{0}".format(traceback.format_exc())) first_run = False xbmc.sleep(1000)