From 091ca6e9975d8325e2fb46610e2761391f9a3998 Mon Sep 17 00:00:00 2001 From: shaun Date: Thu, 25 Jan 2018 08:19:32 +1100 Subject: [plugin.video.embycon] 1.4.39 --- plugin.video.embycon/resources/lib/datamanager.py | 142 +--------------------- 1 file changed, 5 insertions(+), 137 deletions(-) (limited to 'plugin.video.embycon/resources/lib/datamanager.py') diff --git a/plugin.video.embycon/resources/lib/datamanager.py b/plugin.video.embycon/resources/lib/datamanager.py index f5f69b5..feda9f0 100644 --- a/plugin.video.embycon/resources/lib/datamanager.py +++ b/plugin.video.embycon/resources/lib/datamanager.py @@ -1,22 +1,13 @@ # Gnu General Public License - see LICENSE.TXT -import hashlib -import os -import threading import json -import encodings - -import xbmcaddon -import xbmc +from collections import defaultdict from downloadutils import DownloadUtils from simple_logging import SimpleLogging -from utils import getChecksum -from kodi_utils import HomeWindow log = SimpleLogging(__name__) - class DataManager(): cacheDataResult = None dataUrl = None @@ -26,135 +17,12 @@ class DataManager(): def __init__(self, *args): log.debug("DataManager __init__") - def getCacheValidatorFromData(self, result): - key = 'Items' - results = result.get(key) - if results is None: - key = 'SearchHints' - results = result.get(key) - if results is None: - results = [] - - itemCount = 0 - dataHashString = "" - - for item in results: - item_hash_string = getChecksum(item) - item_hash_string = str(itemCount) + "_" + key + "_" + item.get("Name", "-") + "_" + item_hash_string + "|" - log.debug("ITEM_HASH: " + item_hash_string) - dataHashString += item_hash_string - itemCount += 1 - - # hash the data - dataHashString = dataHashString.encode("UTF-8") - m = hashlib.md5() - m.update(dataHashString) - validatorString = m.hexdigest() - - log.debug("getCacheValidatorFromData : RawData : " + dataHashString) - log.debug("getCacheValidatorFromData : hashData : " + validatorString) - - return validatorString - def loadJasonData(self, jsonData): - return json.loads(jsonData) + return json.loads(jsonData, object_hook=lambda d: defaultdict(lambda: None, d)) def GetContent(self, url): + jsonData = DownloadUtils().downloadUrl(url) + result = self.loadJasonData(jsonData) + return result - __addon__ = xbmcaddon.Addon(id='plugin.video.embycon') - use_cache_system = __addon__.getSetting('cacheEmbyData') == "true" - - if use_cache_system == False: - # dont use cache system at all, just get the result and return - log.debug("GetContent - Not using cache system") - jsonData = DownloadUtils().downloadUrl(url, suppress=False, popup=1) - result = self.loadJasonData(jsonData) - log.debug("Returning Loaded Result") - return result - - # first get the url hash - m = hashlib.md5() - m.update(url) - urlHash = m.hexdigest() - - # build cache data path - - __addondir__ = xbmc.translatePath(__addon__.getAddonInfo('profile')) - if not os.path.exists(os.path.join(__addondir__, "cache")): - os.makedirs(os.path.join(__addondir__, "cache")) - cacheDataPath = os.path.join(__addondir__, "cache", urlHash) - - log.debug("Cache_Data_Manager:" + cacheDataPath) - - # are we forcing a reload - WINDOW = HomeWindow() - force_data_reload = WINDOW.getProperty("force_data_reload") == "true" - WINDOW.clearProperty("force_data_reload") - - if os.path.exists(cacheDataPath) and not force_data_reload: - # load data from cache if it is available and trigger a background - # verification process to test cache validity - log.debug("Loading Cached File") - with open(cacheDataPath, 'r') as f: - result = self.loadJasonData(f.read()) - - # start a worker thread to process the cache validity - self.cacheDataResult = result - self.dataUrl = url - self.cacheDataPath = cacheDataPath - actionThread = CacheManagerThread() - actionThread.setCacheData(self) - actionThread.start() - - log.debug("Returning Cached Result") - return result - else: - # no cache data so load the url and save it - jsonData = DownloadUtils().downloadUrl(url, suppress=False, popup=1) - log.debug("Loading URL and saving to cache") - with open(cacheDataPath, 'w') as f: - f.write(jsonData) - result = self.loadJasonData(jsonData) - self.cacheManagerFinished = True - log.debug("Returning Loaded Result") - return result - - -class CacheManagerThread(threading.Thread): - dataManager = None - - def __init__(self, *args): - threading.Thread.__init__(self, *args) - - def setCacheData(self, data): - self.dataManager = data - - def run(self): - - log.debug("CacheManagerThread Started") - - cacheValidatorString = self.dataManager.getCacheValidatorFromData(self.dataManager.cacheDataResult) - log.debug("Cache Validator String (" + cacheValidatorString + ")") - - jsonData = DownloadUtils().downloadUrl(self.dataManager.dataUrl, suppress=False, popup=1) - loadedResult = self.dataManager.loadJasonData(jsonData) - loadedValidatorString = self.dataManager.getCacheValidatorFromData(loadedResult) - log.debug("Loaded Validator String (" + loadedValidatorString + ")") - - # if they dont match then save the data and trigger a content reload - if (cacheValidatorString != loadedValidatorString): - log.debug("CacheManagerThread Saving new cache data and reloading container") - with open(self.dataManager.cacheDataPath, 'w') as f: - f.write(jsonData) - - # we need to refresh but will wait until the main function has finished - loops = 0 - while (self.dataManager.canRefreshNow == False and loops < 200 and not xbmc.Monitor().abortRequested()): - log.debug("Cache_Data_Manager: Not finished yet") - xbmc.sleep(100) - loops = loops + 1 - - log.debug("Sending container refresh (" + str(loops) + ")") - xbmc.executebuiltin("Container.Refresh") - log.debug("CacheManagerThread Exited") -- cgit v1.2.3