From ca115285932a7e367c5467c6190ea90cb4246d17 Mon Sep 17 00:00:00 2001 From: croneter Date: Sun, 11 Feb 2018 13:24:00 +0100 Subject: [PATCH] Prettify --- resources/lib/entrypoint.py | 4 +- resources/lib/itemtypes.py | 18 ++--- resources/lib/librarysync.py | 10 +-- resources/lib/plexbmchelper/subscribers.py | 4 +- resources/lib/utils.py | 90 ++++++++++++++-------- resources/lib/websocket_client.py | 14 ++-- 6 files changed, 82 insertions(+), 58 deletions(-) diff --git a/resources/lib/entrypoint.py b/resources/lib/entrypoint.py index 619801f6..b8f5bb26 100644 --- a/resources/lib/entrypoint.py +++ b/resources/lib/entrypoint.py @@ -12,7 +12,7 @@ from xbmc import sleep, executebuiltin, translatePath from xbmcgui import ListItem from utils import window, settings, language as lang, dialog, try_encode, \ - CatchExceptions, exists_dir, plex_command, try_decode + catch_exceptions, exists_dir, plex_command, try_decode import downloadutils from PlexFunctions import GetPlexMetadata, GetPlexSectionResults, \ @@ -473,7 +473,7 @@ def getVideoFiles(plexId, params): xbmcplugin.endOfDirectory(HANDLE) -@CatchExceptions(warnuser=False) +@catch_exceptions(warnuser=False) def getExtraFanArt(plexid, plexPath): """ Get extrafanart for listitem diff --git a/resources/lib/itemtypes.py b/resources/lib/itemtypes.py index 25414cb4..a8e63238 100644 --- a/resources/lib/itemtypes.py +++ b/resources/lib/itemtypes.py @@ -6,7 +6,7 @@ from ntpath import dirname from datetime import datetime from artwork import Artwork -from utils import window, kodi_sql, CatchExceptions +from utils import window, kodi_sql, catch_exceptions import plexdb_functions as plexdb import kodidb_functions as kodidb @@ -61,7 +61,7 @@ class Items(object): self.kodiconn.close() return self - @CatchExceptions(warnuser=True) + @catch_exceptions(warnuser=True) def getfanart(self, plex_id, refresh=False): """ Tries to get additional fanart for movies (+sets) and TV shows. @@ -177,7 +177,7 @@ class Movies(Items): """ Used for plex library-type movies """ - @CatchExceptions(warnuser=True) + @catch_exceptions(warnuser=True) def add_update(self, item, viewtag=None, viewid=None): """ Process single movie @@ -509,7 +509,7 @@ class TVShows(Items): """ For Plex library-type TV shows """ - @CatchExceptions(warnuser=True) + @catch_exceptions(warnuser=True) def add_update(self, item, viewtag=None, viewid=None): """ Process a single show @@ -742,7 +742,7 @@ class TVShows(Items): tags.extend(collections) self.kodi_db.addTags(showid, tags, "tvshow") - @CatchExceptions(warnuser=True) + @catch_exceptions(warnuser=True) def add_updateSeason(self, item, viewtag=None, viewid=None): """ Process a single season of a certain tv show @@ -790,7 +790,7 @@ class TVShows(Items): view_id=viewid, checksum=checksum) - @CatchExceptions(warnuser=True) + @catch_exceptions(warnuser=True) def add_updateEpisode(self, item, viewtag=None, viewid=None): """ Process single episode @@ -1282,7 +1282,7 @@ class Music(Items): self.kodi_db = kodidb.Kodidb_Functions(self.kodicursor) return self - @CatchExceptions(warnuser=True) + @catch_exceptions(warnuser=True) def add_updateArtist(self, item, viewtag=None, viewid=None): """ Adds a single artist @@ -1368,7 +1368,7 @@ class Music(Items): # Update artwork artwork.addArtwork(artworks, artistid, v.KODI_TYPE_ARTIST, kodicursor) - @CatchExceptions(warnuser=True) + @catch_exceptions(warnuser=True) def add_updateAlbum(self, item, viewtag=None, viewid=None, children=None, scan_children=True): """ @@ -1565,7 +1565,7 @@ class Music(Items): for child in children: self.add_updateSong(child, viewtag, viewid) - @CatchExceptions(warnuser=True) + @catch_exceptions(warnuser=True) def add_updateSong(self, item, viewtag=None, viewid=None): """ Process single song diff --git a/resources/lib/librarysync.py b/resources/lib/librarysync.py index 150fa594..4f6886f1 100644 --- a/resources/lib/librarysync.py +++ b/resources/lib/librarysync.py @@ -9,7 +9,7 @@ import xbmc from xbmcvfs import exists from utils import window, settings, unix_timestamp, thread_methods, \ - create_actor_db_index, dialog, LogTime, playlist_xsp, language as lang, \ + create_actor_db_index, dialog, log_time, playlist_xsp, language as lang, \ unix_date_to_kodi, reset, try_decode, delete_playlists, delete_nodes, \ try_encode, compare_version import downloadutils @@ -218,7 +218,7 @@ class LibrarySync(Thread): # Create an index for actors to speed up sync create_actor_db_index() - @LogTime + @log_time def fullSync(self, repair=False): """ repair=True: force sync EVERY item @@ -727,7 +727,7 @@ class LibrarySync(Thread): }) self.updatelist = [] - @LogTime + @log_time def PlexMovies(self): # Initialize self.allPlexElementsId = {} @@ -819,7 +819,7 @@ class LibrarySync(Thread): with itemMth() as method: method.updateUserdata(xml) - @LogTime + @log_time def PlexTVShows(self): # Initialize self.allPlexElementsId = {} @@ -949,7 +949,7 @@ class LibrarySync(Thread): log.info("%s sync is finished." % itemType) return True - @LogTime + @log_time def PlexMusic(self): itemType = 'Music' diff --git a/resources/lib/plexbmchelper/subscribers.py b/resources/lib/plexbmchelper/subscribers.py index 95041870..aa3bb8ab 100644 --- a/resources/lib/plexbmchelper/subscribers.py +++ b/resources/lib/plexbmchelper/subscribers.py @@ -6,7 +6,7 @@ from logging import getLogger from threading import Thread, RLock from downloadutils import DownloadUtils as DU -from utils import window, kodi_time_to_millis, Lock_Function +from utils import window, kodi_time_to_millis, LockFunction import state import variables as v import json_rpc as js @@ -17,7 +17,7 @@ import playqueue as PQ LOG = getLogger("PLEX." + __name__) # Need to lock all methods and functions messing with subscribers or state LOCK = RLock() -LOCKER = Lock_Function(LOCK) +LOCKER = LockFunction(LOCK) ############################################################################### diff --git a/resources/lib/utils.py b/resources/lib/utils.py index 3c40057c..0a6e62c5 100644 --- a/resources/lib/utils.py +++ b/resources/lib/utils.py @@ -242,20 +242,20 @@ def kodi_time_to_millis(time): return ret -def try_encode(uniString, encoding='utf-8'): +def try_encode(input_str, encoding='utf-8'): """ - Will try to encode uniString (in unicode) to encoding. This possibly + Will try to encode input_str (in unicode) to encoding. This possibly fails with e.g. Android TV's Python, which does not accept arguments for string.encode() """ - if isinstance(uniString, str): + if isinstance(input_str, str): # already encoded - return uniString + return input_str try: - uniString = uniString.encode(encoding, "ignore") + input_str = input_str.encode(encoding, "ignore") except TypeError: - uniString = uniString.encode() - return uniString + input_str = input_str.encode() + return input_str def try_decode(string, encoding='utf-8'): @@ -878,10 +878,7 @@ def passwords_xml(): settings('networkCreds', value="%s" % server) LOG.info("Added server: %s to passwords.xml", server) # Prettify and write to file - try: - indent(root) - except: - pass + indent(root) etree.ElementTree(root).write(xmlpath, encoding="UTF-8") @@ -957,7 +954,7 @@ def delete_nodes(): ############################################################################### # WRAPPERS -def CatchExceptions(warnuser=False): +def catch_exceptions(warnuser=False): """ Decorator for methods to catch exceptions and log them. Useful for e.g. librarysync threads using itemtypes.py, because otherwise we would not @@ -967,12 +964,18 @@ def CatchExceptions(warnuser=False): which will trigger a Kodi infobox to inform user """ def decorate(func): + """ + Decorator construct + """ @wraps(func) def wrapper(*args, **kwargs): + """ + Wrapper construct + """ try: return func(*args, **kwargs) - except Exception as e: - LOG.error('%s has crashed. Error: %s', func.__name__, e) + except Exception as err: + LOG.error('%s has crashed. Error: %s', func.__name__, err) import traceback LOG.error("Traceback:\n%s", traceback.format_exc()) if warnuser: @@ -982,7 +985,7 @@ def CatchExceptions(warnuser=False): return decorate -def LogTime(func): +def log_time(func): """ Decorator for functions and methods to log the time it took to run the code """ @@ -1010,10 +1013,10 @@ def thread_methods(cls=None, add_stops=None, add_suspends=None): ALSO returns True if PKC should exit Also adds the following class attributes: - __thread_stopped - __thread_suspended - __stops - __suspends + thread_stopped + thread_suspended + stops + suspends invoke with either @Newthread_methods @@ -1030,41 +1033,56 @@ def thread_methods(cls=None, add_stops=None, add_suspends=None): add_suspends=add_suspends) # Because we need a reference, not a copy of the immutable objects in # state, we need to look up state every time explicitly - cls.__stops = ['STOP_PKC'] + cls.stops = ['STOP_PKC'] if add_stops is not None: - cls.__stops.extend(add_stops) - cls.__suspends = add_suspends or [] + cls.stops.extend(add_stops) + cls.suspends = add_suspends or [] # Attach new attributes to class - cls.__thread_stopped = False - cls.__thread_suspended = False + cls.thread_stopped = False + cls.thread_suspended = False # Define new class methods and attach them to class def stop_thread(self): - self.__thread_stopped = True + """ + Call to stop this thread + """ + self.thread_stopped = True cls.stop_thread = stop_thread def suspend_thread(self): - self.__thread_suspended = True + """ + Call to suspend this thread + """ + self.thread_suspended = True cls.suspend_thread = suspend_thread def resume_thread(self): - self.__thread_suspended = False + """ + Call to revive a suspended thread back to life + """ + self.thread_suspended = False cls.resume_thread = resume_thread def thread_suspended(self): - if self.__thread_suspended is True: + """ + Returns True if the thread is suspended + """ + if self.thread_suspended is True: return True - for suspend in self.__suspends: + for suspend in self.suspends: if getattr(state, suspend): return True return False cls.thread_suspended = thread_suspended def thread_stopped(self): - if self.__thread_stopped is True: + """ + Returns True if the thread is stopped + """ + if self.thread_stopped is True: return True - for stop in self.__stops: + for stop in self.stops: if getattr(state, stop): return True return False @@ -1074,12 +1092,12 @@ def thread_methods(cls=None, add_stops=None, add_suspends=None): return cls -class Lock_Function(object): +class LockFunction(object): """ Decorator for class methods and functions to lock them with lock. Initialize this class first - lockfunction = Lock_Function(lock), where lock is a threading.Lock() object + lockfunction = LockFunction(lock), where lock is a threading.Lock() object To then lock a function or method: @@ -1090,8 +1108,14 @@ class Lock_Function(object): self.lock = lock def lockthis(self, func): + """ + Use this method to actually lock a function or method + """ @wraps(func) def wrapper(*args, **kwargs): + """ + Wrapper construct + """ with self.lock: result = func(*args, **kwargs) return result diff --git a/resources/lib/websocket_client.py b/resources/lib/websocket_client.py index 16e14a0d..a494fb7a 100644 --- a/resources/lib/websocket_client.py +++ b/resources/lib/websocket_client.py @@ -213,8 +213,8 @@ class Alexa_Websocket(WebSocket): Can't use thread_methods! """ - __thread_stopped = False - __thread_suspended = False + thread_stopped = False + thread_suspended = False def getUri(self): uri = ('wss://pubsub.plex.tv/sub/websockets/%s/%s?X-Plex-Token=%s' @@ -256,16 +256,16 @@ class Alexa_Websocket(WebSocket): # Path in thread_methods def stop_thread(self): - self.__thread_stopped = True + self.thread_stopped = True def suspend_thread(self): - self.__thread_suspended = True + self.thread_suspended = True def resume_thread(self): - self.__thread_suspended = False + self.thread_suspended = False def thread_stopped(self): - if self.__thread_stopped is True: + if self.thread_stopped is True: return True if state.STOP_PKC: return True @@ -276,7 +276,7 @@ class Alexa_Websocket(WebSocket): """ Overwrite method since we need to check for plex token """ - if self.__thread_suspended is True: + if self.thread_suspended is True: return True if not state.PLEX_TOKEN: return True