From e818e231490b6800d4c011019cac703c5b571e6c Mon Sep 17 00:00:00 2001 From: tomkat83 Date: Fri, 20 Jan 2017 17:21:51 +0100 Subject: [PATCH] Rewire image cache thread to service.py --- resources/lib/artwork.py | 72 ++++++++++++++++++++-------------------- service.py | 7 ++++ 2 files changed, 43 insertions(+), 36 deletions(-) diff --git a/resources/lib/artwork.py b/resources/lib/artwork.py index 89990832..badcda45 100644 --- a/resources/lib/artwork.py +++ b/resources/lib/artwork.py @@ -1,17 +1,17 @@ # -*- coding: utf-8 -*- ############################################################################### -import json import logging +from json import dumps, loads import requests -import os +from os import path as os_path from urllib import quote_plus, unquote from threading import Thread -import Queue +from Queue import Queue, Empty -import xbmc -import xbmcgui -import xbmcvfs +from xbmc import executeJSONRPC, sleep, translatePath +from xbmcgui import Dialog +from xbmcvfs import listdir, delete from utils import window, settings, language as lang, kodiSQL, tryEncode, \ tryDecode, IfExists, ThreadMethods, ThreadMethodsAdditionalStop @@ -25,6 +25,8 @@ log = logging.getLogger("PLEX."+__name__) ############################################################################### +ARTWORK_QUEUE = Queue() + def setKodiWebServerDetails(): """ @@ -41,8 +43,8 @@ def setKodiWebServerDetails(): "setting": "services.webserver" } } - result = xbmc.executeJSONRPC(json.dumps(web_query)) - result = json.loads(result) + result = executeJSONRPC(dumps(web_query)) + result = loads(result) try: xbmc_webserver_enabled = result['result']['value'] except (KeyError, TypeError): @@ -58,7 +60,7 @@ def setKodiWebServerDetails(): "value": 8080 } } - result = xbmc.executeJSONRPC(json.dumps(web_port)) + result = executeJSONRPC(dumps(web_port)) xbmc_port = 8080 web_user = { "jsonrpc": "2.0", @@ -69,7 +71,7 @@ def setKodiWebServerDetails(): "value": True } } - result = xbmc.executeJSONRPC(json.dumps(web_user)) + result = executeJSONRPC(dumps(web_user)) xbmc_username = "kodi" # Webserver already enabled web_port = { @@ -80,8 +82,8 @@ def setKodiWebServerDetails(): "setting": "services.webserverport" } } - result = xbmc.executeJSONRPC(json.dumps(web_port)) - result = json.loads(result) + result = executeJSONRPC(dumps(web_port)) + result = loads(result) try: xbmc_port = result['result']['value'] except (TypeError, KeyError): @@ -94,8 +96,8 @@ def setKodiWebServerDetails(): "setting": "services.webserverusername" } } - result = xbmc.executeJSONRPC(json.dumps(web_user)) - result = json.loads(result) + result = executeJSONRPC(dumps(web_user)) + result = loads(result) try: xbmc_username = result['result']['value'] except TypeError: @@ -108,8 +110,8 @@ def setKodiWebServerDetails(): "setting": "services.webserverpassword" } } - result = xbmc.executeJSONRPC(json.dumps(web_pass)) - result = json.loads(result) + result = executeJSONRPC(dumps(web_pass)) + result = loads(result) try: xbmc_password = result['result']['value'] except TypeError: @@ -135,8 +137,8 @@ class Image_Cache_Thread(Thread): # Hence let Kodi wait till download is successful timeout = (35.1, 35.1) - def __init__(self, queue): - self.queue = queue + def __init__(self): + self.queue = ARTWORK_QUEUE Thread.__init__(self) def threadSuspended(self): @@ -158,11 +160,11 @@ class Image_Cache_Thread(Thread): # Abort was requested while waiting. We should exit log.info("---===### Stopped Image_Cache_Thread ###===---") return - xbmc.sleep(1000) + sleep(1000) try: url = queue.get(block=False) - except Queue.Empty: - xbmc.sleep(1000) + except Empty: + sleep(1000) continue sleep = 0 while True: @@ -187,7 +189,7 @@ class Image_Cache_Thread(Thread): 'over-loaded. Sleep %s seconds before trying ' 'again to download %s' % (2**sleep, double_urldecode(url))) - xbmc.sleep((2**sleep)*1000) + sleep((2**sleep)*1000) sleep += 1 continue except Exception as e: @@ -201,45 +203,43 @@ class Image_Cache_Thread(Thread): queue.task_done() log.debug('Cached art: %s' % double_urldecode(url)) # Sleep for a bit to reduce CPU strain - xbmc.sleep(sleep_between) + sleep(sleep_between) log.info("---===### Stopped Image_Cache_Thread ###===---") class Artwork(): enableTextureCache = settings('enableTextureCache') == "true" if enableTextureCache: - queue = Queue.Queue() - download_thread = Image_Cache_Thread(queue) - download_thread.start() + queue = ARTWORK_QUEUE def fullTextureCacheSync(self): """ This method will sync all Kodi artwork to textures13.db and cache them locally. This takes diskspace! """ - if not xbmcgui.Dialog().yesno( + if not Dialog().yesno( "Image Texture Cache", lang(39250)): return log.info("Doing Image Cache Sync") # ask to rest all existing or not - if xbmcgui.Dialog().yesno( + if Dialog().yesno( "Image Texture Cache", lang(39251), ""): log.info("Resetting all cache data first") # Remove all existing textures first - path = tryDecode(xbmc.translatePath("special://thumbnails/")) + path = tryDecode(translatePath("special://thumbnails/")) if IfExists(path): - allDirs, allFiles = xbmcvfs.listdir(path) + allDirs, allFiles = listdir(path) for dir in allDirs: - allDirs, allFiles = xbmcvfs.listdir(path+dir) + allDirs, allFiles = listdir(path+dir) for file in allFiles: - if os.path.supports_unicode_filenames: - xbmcvfs.delete(os.path.join( + if os_path.supports_unicode_filenames: + delete(os_path.join( path + tryDecode(dir), tryDecode(file))) else: - xbmcvfs.delete(os.path.join( + delete(os_path.join( tryEncode(path) + dir, file)) @@ -439,10 +439,10 @@ class Artwork(): else: # Delete thumbnail as well as the entry thumbnails = tryDecode( - xbmc.translatePath("special://thumbnails/%s" % cachedurl)) + translatePath("special://thumbnails/%s" % cachedurl)) log.debug("Deleting cached thumbnail: %s" % thumbnails) try: - xbmcvfs.delete(thumbnails) + delete(thumbnails) except Exception as e: log.error('Could not delete cached artwork %s. Error: %s' % (thumbnails, e)) diff --git a/service.py b/service.py index 3515919e..ed204f0a 100644 --- a/service.py +++ b/service.py @@ -46,6 +46,7 @@ import PlexAPI from PlexCompanion import PlexCompanion from monitor_kodi_play import Monitor_Kodi_Play from playback_starter import Playback_Starter +from artwork import Image_Cache_Thread ############################################################################### @@ -76,6 +77,7 @@ class Service(): playqueue_running = False kodimonitor_running = False playback_starter_running = False + image_cache_thread_running = False def __init__(self): @@ -153,6 +155,8 @@ class Service(): self.plexCompanion = PlexCompanion(self) self.playqueue = Playqueue(self) self.playback_starter = Playback_Starter(self) + if settings('enableTextureCache') == "true": + self.image_cache_thread = Image_Cache_Thread() plx = PlexAPI.PlexAPI() @@ -211,6 +215,9 @@ class Service(): if not self.playback_starter_running: self.playback_starter_running = True self.playback_starter.start() + if not self.image_cache_thread_running: + self.image_cache_thread_running = True + self.image_cache_thread.start() else: if (self.user.currUser is None) and self.warn_auth: # Alert user is not authenticated and suppress future