Fix thread methods

This commit is contained in:
tomkat83 2017-05-17 13:55:24 +02:00
parent 2615ecfd79
commit 06727fca71
14 changed files with 68 additions and 65 deletions

View file

@ -2566,7 +2566,6 @@ class API():
if forceCheck is False:
# Validate the path is correct with user intervention
if self.askToValidate(path):
import state
state.STOP_SYNC = True
path = None
window('plex_pathverified', value='true')

View file

@ -7,14 +7,13 @@ from urllib import urlencode
from xbmc import sleep, executebuiltin
from utils import settings, ThreadMethods
from utils import settings, thread_methods
from plexbmchelper import listener, plexgdm, subscribers, functions, \
httppersist, plexsettings
from PlexFunctions import ParseContainerKey, GetPlexMetadata
from PlexAPI import API
import player
import variables as v
import state
###############################################################################
@ -23,7 +22,7 @@ log = logging.getLogger("PLEX."+__name__)
###############################################################################
@ThreadMethods(add_suspends=[state.PMS_STATUS])
@thread_methods(add_suspends=['PMS_STATUS'])
class PlexCompanion(Thread):
"""
"""

View file

@ -13,8 +13,7 @@ from xbmc import executeJSONRPC, sleep, translatePath
from xbmcvfs import exists
from utils import window, settings, language as lang, kodiSQL, tryEncode, \
ThreadMethods, dialog, exists_dir
import state
thread_methods, dialog, exists_dir
# Disable annoying requests warnings
import requests.packages.urllib3
@ -127,8 +126,8 @@ def double_urldecode(text):
return unquote(unquote(text))
@ThreadMethods(add_stops=[state.STOP_SYNC],
add_suspends=[state.SUSPEND_LIBRARY_THREAD, state.DB_SCAN])
@thread_methods(add_stops=['STOP_SYNC'],
add_suspends=['SUSPEND_LIBRARY_THREAD', 'DB_SCAN'])
class Image_Cache_Thread(Thread):
xbmc_host = 'localhost'
xbmc_port, xbmc_username, xbmc_password = setKodiWebServerDetails()

View file

@ -6,7 +6,7 @@ from Queue import Queue
from xbmc import sleep
from utils import window, ThreadMethods
from utils import window, thread_methods
import state
###############################################################################
@ -15,7 +15,7 @@ log = logging.getLogger("PLEX."+__name__)
###############################################################################
@ThreadMethods
@thread_methods
class Monitor_Window(Thread):
"""
Monitors window('plex_command') for new entries that we need to take care

View file

@ -5,11 +5,10 @@ from Queue import Empty
from xbmc import sleep
from utils import ThreadMethods, window
from utils import thread_methods
import plexdb_functions as plexdb
import itemtypes
import variables as v
import state
###############################################################################
@ -18,8 +17,8 @@ log = getLogger("PLEX."+__name__)
###############################################################################
@ThreadMethods(add_suspends=[state.SUSPEND_LIBRARY_THREAD, state.DB_SCAN],
add_stops=[state.STOP_SYNC])
@thread_methods(add_suspends=['SUSPEND_LIBRARY_THREAD', 'DB_SCAN'],
add_stops=['STOP_SYNC'])
class Process_Fanart_Thread(Thread):
"""
Threaded download of additional fanart in the background

View file

@ -5,10 +5,9 @@ from Queue import Empty
from xbmc import sleep
from utils import ThreadMethods, window
from utils import thread_methods, window
from PlexFunctions import GetPlexMetadata, GetAllPlexChildren
import sync_info
import state
###############################################################################
@ -17,7 +16,7 @@ log = getLogger("PLEX."+__name__)
###############################################################################
@ThreadMethods(add_stops=[state.SUSPEND_LIBRARY_THREAD])
@thread_methods(add_stops=['SUSPEND_LIBRARY_THREAD'])
class Threaded_Get_Metadata(Thread):
"""
Threaded download of Plex XML metadata for a certain library item.

View file

@ -5,10 +5,9 @@ from Queue import Empty
from xbmc import sleep
from utils import ThreadMethods
from utils import thread_methods
import itemtypes
import sync_info
import state
###############################################################################
log = getLogger("PLEX."+__name__)
@ -16,7 +15,7 @@ log = getLogger("PLEX."+__name__)
###############################################################################
@ThreadMethods(add_stops=[state.SUSPEND_LIBRARY_THREAD])
@thread_methods(add_stops=['SUSPEND_LIBRARY_THREAD'])
class Threaded_Process_Metadata(Thread):
"""
Not yet implemented for more than 1 thread - if ever. Only to be called by

View file

@ -4,8 +4,7 @@ from threading import Thread, Lock
from xbmc import sleep
from utils import ThreadMethods, language as lang
import state
from utils import thread_methods, language as lang
###############################################################################
@ -19,7 +18,7 @@ LOCK = Lock()
###############################################################################
@ThreadMethods(add_stops=[state.SUSPEND_LIBRARY_THREAD])
@thread_methods(add_stops=['SUSPEND_LIBRARY_THREAD'])
class Threaded_Show_Sync_Info(Thread):
"""
Threaded class to show the Kodi statusbar of the metadata download.

View file

@ -10,7 +10,7 @@ import xbmcgui
from xbmcvfs import exists
from utils import window, settings, getUnixTimestamp, sourcesXML,\
ThreadMethods, create_actor_db_index, dialog, LogTime, getScreensaver,\
thread_methods, create_actor_db_index, dialog, LogTime, getScreensaver,\
setScreensaver, playlistXSP, language as lang, DateToKodi, reset,\
advancedsettings_tweaks, tryDecode, deletePlaylists, deleteNodes
import downloadutils
@ -38,8 +38,8 @@ log = logging.getLogger("PLEX."+__name__)
###############################################################################
@ThreadMethods(add_stops=[state.STOP_SYNC],
add_suspends=[state.SUSPEND_LIBRARY_THREAD])
@thread_methods(add_stops=['STOP_SYNC'],
add_suspends=['SUSPEND_LIBRARY_THREAD'])
class LibrarySync(Thread):
"""
"""

View file

@ -5,13 +5,12 @@ from threading import RLock, Thread
from xbmc import sleep, Player, PlayList, PLAYLIST_MUSIC, PLAYLIST_VIDEO
from utils import window, ThreadMethods
from utils import window, thread_methods
import playlist_func as PL
from PlexFunctions import ConvertPlexToKodiTime, GetAllPlexChildren
from PlexAPI import API
from playbackutils import PlaybackUtils
import variables as v
import state
###############################################################################
log = logging.getLogger("PLEX."+__name__)
@ -22,7 +21,7 @@ PLUGIN = 'plugin://%s' % v.ADDON_ID
###############################################################################
@ThreadMethods(add_suspends=[state.PMS_STATUS])
@thread_methods(add_suspends=['PMS_STATUS'])
class Playqueue(Thread):
"""
Monitors Kodi's playqueues for changes on the Kodi side

View file

@ -4,13 +4,14 @@
# Quit PKC
STOP_PKC = False
# Usually triggered by another Python instance - will have to be set (by
# polling window) through e.g. librarysync thread
SUSPEND_LIBRARY_THREAD = False
# Set if user decided to cancel sync
STOP_SYNC = False
# Set if a Plex-Kodi DB sync is being done - along with window('plex_dbScan')
# set to 'true'
# Set if a Plex-Kodi DB sync is being done - along with
# window('plex_dbScan') set to 'true'
DB_SCAN = False
# Plex Media Server Status - along with window('plex_serverStatus')
PMS_STATUS = False

View file

@ -10,7 +10,7 @@ import xbmcaddon
from xbmcvfs import exists
from utils import window, settings, language as lang, ThreadMethods
from utils import window, settings, language as lang, thread_methods
import downloadutils
import PlexAPI
@ -24,7 +24,7 @@ log = logging.getLogger("PLEX."+__name__)
###############################################################################
@ThreadMethods(add_suspends=[state.SUSPEND_USER_CLIENT])
@thread_methods(add_suspends=['SUSPEND_USER_CLIENT'])
class UserClient(threading.Thread):
# Borg - multiple instances, shared state

View file

@ -86,7 +86,7 @@ def plex_command(key, value):
value: either 'True' or 'False'
"""
while window('plex_command'):
xbmc.sleep(1)
xbmc.sleep(5)
window('plex_command', value='%s-%s' % (key, value))
@ -920,7 +920,7 @@ def LogTime(func):
return wrapper
def ThreadMethods(cls=None, add_stops=None, add_suspends=None):
def thread_methods(cls=None, add_stops=None, add_suspends=None):
"""
Decorator to add the following methods to a threading class:
@ -928,52 +928,69 @@ def ThreadMethods(cls=None, add_stops=None, add_suspends=None):
resume_thread(): resumes the thread
stop_thread(): stopps/kills the thread
thread_suspended(): returns True if thread is suspend_thread
thread_suspended(): returns True if thread is suspended
thread_stopped(): returns True if thread is stopped (or should stop ;-))
ALSO stops if PKC should exit
ALSO returns True if PKC should exit
Also adds the following class attributes:
_thread_stopped
_thread_suspended
__thread_stopped
__thread_suspended
__stops
__suspends
invoke with either
@NewThreadMethods
@Newthread_methods
class MyClass():
or
@NewThreadMethods(add_stops=[state.SUSPEND_LIBRARY_TRHEAD],
add_suspends=[state.WHATEVER, state.WHATEVER2])
@Newthread_methods(add_stops=['SUSPEND_LIBRARY_TRHEAD'],
add_suspends=['DB_SCAN', 'WHATEVER'])
class MyClass():
"""
# So we don't need to invoke with ()
if cls is None:
return partial(ThreadMethods,
return partial(thread_methods,
add_stops=add_stops,
add_suspends=add_suspends)
# Make sure we have an iterable
add_stops = add_stops or []
add_suspends = add_suspends or []
# 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']
if add_stops is not None:
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
self.__thread_stopped = True
cls.stop_thread = stop_thread
def suspend_thread(self):
self._thread_suspended = True
self.__thread_suspended = True
cls.suspend_thread = suspend_thread
def resume_thread(self):
self._thread_suspended = False
self.__thread_suspended = False
cls.resume_thread = resume_thread
def thread_suspended(self):
return self._thread_suspended or any(add_suspends)
if self.__thread_suspended is True:
return True
for suspend in self.__suspends:
if getattr(state, suspend):
return True
return False
cls.thread_suspended = thread_suspended
def thread_stopped(self):
return self._thread_stopped or state.STOP_PKC or any(add_stops)
if self.__thread_stopped is True:
return True
for stop in self.__stops:
if getattr(state, stop):
return True
return False
cls.thread_stopped = thread_stopped
# Return class to render this a decorator

View file

@ -11,7 +11,7 @@ from ssl import CERT_NONE
from xbmc import sleep
from utils import window, settings, ThreadMethods
from utils import window, settings, thread_methods
from companion import process_command
import state
@ -22,7 +22,7 @@ log = logging.getLogger("PLEX."+__name__)
###############################################################################
@ThreadMethods(add_suspends=[state.SUSPEND_LIBRARY_THREAD])
@thread_methods(add_suspends=['SUSPEND_LIBRARY_THREAD'])
class WebSocket(Thread):
opcode_data = (websocket.ABNF.OPCODE_TEXT, websocket.ABNF.OPCODE_BINARY)
@ -140,10 +140,10 @@ class WebSocket(Thread):
def stopThread(self):
"""
Overwrite this method from ThreadMethods to close websockets
Overwrite this method from thread_methods to close websockets
"""
log.info("Stopping %s thread." % self.__class__.__name__)
self._threadStopped = True
self.__threadStopped = True
try:
self.ws.shutdown()
except:
@ -209,6 +209,7 @@ class PMS_Websocket(WebSocket):
window('plex_online', value='false')
@thread_methods(add_suspends=['RESTRICTED_USER', 'PLEX_TOKEN'])
class Alexa_Websocket(WebSocket):
"""
Websocket connection to talk to Amazon Alexa
@ -247,11 +248,3 @@ class Alexa_Websocket(WebSocket):
def IOError_response(self):
pass
def thread_suspended(self):
"""
Overwrite to ignore library sync stuff and allow to check for
RESTRICTED_USER and PLEX_TOKEN
"""
return self._thread_suspended or state.RESTRICTED_USER \
or not state.PLEX_TOKEN