From fca5f3c9f221852f66278f2460f885bb490f9a61 Mon Sep 17 00:00:00 2001 From: xnappo Date: Sat, 18 Apr 2015 12:10:06 -0500 Subject: [PATCH] Queue updated items in playback, process on stop --- resources/lib/Player.py | 4 +- resources/lib/WebSocketClient.py | 96 +++++++++++++++++++++----------- 2 files changed, 66 insertions(+), 34 deletions(-) diff --git a/resources/lib/Player.py b/resources/lib/Player.py index cd97edf8..9d4e3d10 100644 --- a/resources/lib/Player.py +++ b/resources/lib/Player.py @@ -9,6 +9,7 @@ import inspect import KodiMonitor import Utils as utils from DownloadUtils import DownloadUtils +from WebSocketClient import WebSocketThread from PlayUtils import PlayUtils from ClientInformation import ClientInformation from LibrarySync import LibrarySync @@ -59,6 +60,7 @@ class Player( xbmc.Player ): def stopAll(self): + WebSocketThread().processPendingActions() if(len(self.played_information) == 0): return @@ -103,7 +105,7 @@ class Player( xbmc.Player ): txt_mac = clientInfo.getMachineId() url = "%s/mediabrowser/Videos/ActiveEncodings" % server url = url + '?DeviceId=' + txt_mac - self.downloadUtils.downloadUrl(url, type="DELETE") + self.downloadUtils.downloadUrl(url, type="DELETE") def stopPlayback(self, data): self.printDebug("stopPlayback called") diff --git a/resources/lib/WebSocketClient.py b/resources/lib/WebSocketClient.py index eaf5c586..70c27c8e 100644 --- a/resources/lib/WebSocketClient.py +++ b/resources/lib/WebSocketClient.py @@ -20,6 +20,9 @@ from LibrarySync import LibrarySync from WriteKodiDB import WriteKodiDB import Utils as utils +pendingUserDataList = [] +pendingItemsToRemove = [] +pendingItemsToUpdate = [] _MODE_BASICPLAY=12 class WebSocketThread(threading.Thread): @@ -65,9 +68,7 @@ class WebSocketThread(threading.Thread): self.logMsg("Exception : " + str(e), level=0) else: self.logMsg("Sending Playback Started NO Object ERROR") - ''' - ''' def playbackStopped(self, itemId, ticks): if(self.client != None): try: @@ -133,6 +134,9 @@ class WebSocketThread(threading.Thread): self.logMsg("Stopping Client NO Object ERROR") def on_message(self, ws, message): + global pendingUserDataList + global pendingItemsToRemove + global pendingItemsToUpdate self.logMsg("Message : " + str(message), 0) result = json.loads(message) @@ -188,12 +192,10 @@ class WebSocketThread(threading.Thread): userDataList = data.get("UserDataList") self.logMsg("Message : Doing UserDataChanged : UserDataList : " + str(userDataList), 0) if(userDataList != None): - for userData in userDataList: - self.logMsg("Message : Doing UserDataChanged : UserData : " + str(userData), 0) - itemId = userData.get("ItemId") - if(itemId != None): - self.logMsg("Message : Doing UserDataChanged : calling updatePlayCount with ID : " + str(itemId), 0) - LibrarySync().updatePlayCount(itemId) + if xbmc.Player().isPlaying(): + pendingUserDataList += userDataList + else: + self.user_data_update(userDataList) elif(messageType != None and messageType == "LibraryChanged"): foldersAddedTo = data.get("FoldersAddedTo") @@ -201,30 +203,48 @@ class WebSocketThread(threading.Thread): # doing items removed itemsRemoved = data.get("ItemsRemoved") - self.logMsg("Message : Doing LibraryChanged : Items Removed : " + str(itemsRemoved), 0) - itemsRemoved = data.get("ItemsRemoved") - for item in itemsRemoved: - self.logMsg("Message : Doing LibraryChanged : Items Removed : Calling deleteEpisodeFromKodiLibraryByMbId: " + item, 0) - WriteKodiDB().deleteEpisodeFromKodiLibraryByMbId(item) - self.logMsg("Message : Doing LibraryChanged : Items Removed : Calling deleteMovieFromKodiLibrary: " + item, 0) - WriteKodiDB().deleteMovieFromKodiLibrary(item) - self.logMsg("Message : Doing LibraryChanged : Items Removed : Calling deleteMusicVideoFromKodiLibrary: " + item, 0) - WriteKodiDB().deleteMusicVideoFromKodiLibrary(item) - - # doing adds and updates itemsAdded = data.get("ItemsAdded") - self.logMsg("Message : Doing LibraryChanged : Items Added : " + str(itemsAdded), 0) itemsUpdated = data.get("ItemsUpdated") - self.logMsg("Message : Doing LibraryChanged : Items Updated : " + str(itemsUpdated), 0) itemsToUpdate = itemsAdded + itemsUpdated - if(len(itemsToUpdate) > 0): - self.logMsg("Message : Doing LibraryChanged : Processing Added and Updated : " + str(itemsToUpdate), 0) - connection = utils.KodiSQL() - cursor = connection.cursor() - LibrarySync().MoviesSync(connection, cursor, fullsync = False, installFirstRun = False, itemList = itemsToUpdate) - LibrarySync().TvShowsSync(connection, cursor, fullsync = False, installFirstRun = False, itemList = itemsToUpdate) - cursor.close() - + self.logMsg("Message : WebSocket LibraryChanged : Items Added : " + str(itemsAdded), 0) + self.logMsg("Message : WebSocket LibraryChanged : Items Updated : " + str(itemsUpdated), 0) + self.logMsg("Message : WebSocket LibraryChanged : Items Removed : " + str(itemsRemoved), 0) + + if xbmc.Player().isPlaying(): + pendingItemsToRemove += itemsRemoved + pendingItemsToUpdate += itemsToUpdate + else: + self.remove_items(itemsRemoved) + self.update_items(itemsToUpdate) + + def remove_items(self, itemsRemoved): + for item in itemsRemoved: + self.logMsg("Message : Doing LibraryChanged : Items Removed : Calling deleteEpisodeFromKodiLibraryByMbId: " + item, 0) + WriteKodiDB().deleteEpisodeFromKodiLibraryByMbId(item) + self.logMsg("Message : Doing LibraryChanged : Items Removed : Calling deleteMovieFromKodiLibrary: " + item, 0) + WriteKodiDB().deleteMovieFromKodiLibrary(item) + self.logMsg("Message : Doing LibraryChanged : Items Removed : Calling deleteMusicVideoFromKodiLibrary: " + item, 0) + WriteKodiDB().deleteMusicVideoFromKodiLibrary(item) + + def update_items(self, itemsToUpdate): + # doing adds and updates + if(len(itemsToUpdate) > 0): + self.logMsg("Message : Doing LibraryChanged : Processing Added and Updated : " + str(itemsToUpdate), 0) + connection = utils.KodiSQL() + cursor = connection.cursor() + LibrarySync().MoviesSync(connection, cursor, fullsync = False, installFirstRun = False, itemList = itemsToUpdate) + LibrarySync().TvShowsSync(connection, cursor, fullsync = False, installFirstRun = False, itemList = itemsToUpdate) + cursor.close() + + def user_data_update(self, userData): + + for userData in userDataList: + self.logMsg("Message : Doing UserDataChanged : UserData : " + str(userData), 0) + itemId = userData.get("ItemId") + if(itemId != None): + self.logMsg("Message : Doing UserDataChanged : calling updatePlayCount with ID : " + str(itemId), 0) + LibrarySync().updatePlayCount(itemId) + def on_error(self, ws, error): self.logMsg("Error : " + str(error)) #raise @@ -273,7 +293,6 @@ class WebSocketThread(threading.Thread): return -1 def run(self): - addonSettings = xbmcaddon.Addon(id='plugin.video.emby') WINDOW = xbmcgui.Window(10000) username = WINDOW.getProperty('currUser') @@ -310,9 +329,20 @@ class WebSocketThread(threading.Thread): self.logMsg("Client Needs To Restart") if self.KodiMonitor.waitForAbort(5): break - self.logMsg("Thread Exited") - - \ No newline at end of file + def processPendingActions(self): + global pendingUserDataList + global pendingItemsToRemove + global pendingItemsToUpdate + if pendingUserDataList != []: + self.user_data_update(pendingUserDataList) + pendingUserDataList = [] + if pendingItemsToRemove != []: + self.remove_items(pendingItemsToRemove) + pendingItemsToRemove = [] + if pendingItemsToUpdate != []: + self.update_items(pendingItemsToUpdate) + pendingItemsToUpdate = [] + \ No newline at end of file