added profiling to default.py to measure speed improvements

added caching to nextup widget generation
This commit is contained in:
Marcel van der Veldt 2015-07-27 18:48:00 +02:00
parent 6264090741
commit 9c639d47ca
3 changed files with 155 additions and 114 deletions

View file

@ -1,101 +1,127 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
import xbmcaddon, xbmc
import os import os, sys
import sys import urlparse
from urlparse import parse_qs
import xbmcaddon
import xbmc
addon_ = xbmcaddon.Addon(id='plugin.video.emby') addon_ = xbmcaddon.Addon(id='plugin.video.emby')
addon_path = addon_.getAddonInfo('path').decode('utf-8') addon_path = addon_.getAddonInfo('path').decode('utf-8')
base_resource_path = xbmc.translatePath(os.path.join(addon_path, 'resources', 'lib')).decode('utf-8') base_resource_path = xbmc.translatePath(os.path.join(addon_path, 'resources', 'lib')).decode('utf-8')
sys.path.append(base_resource_path) sys.path.append(base_resource_path)
import Entrypoint as entrypoint import Entrypoint as entrypoint
# Parse parameters enableProfiling = False
base_url = sys.argv[0]
addon_handle = int(sys.argv[1])
params = parse_qs(sys.argv[2][1:])
xbmc.log("Parameter string: %s" % sys.argv[2])
try: class Main:
# MAIN ENTRY POINT
def __init__(self):
# Parse parameters
base_url = sys.argv[0]
addon_handle = int(sys.argv[1])
params = urlparse.parse_qs(sys.argv[2][1:])
xbmc.log("Parameter string: %s" % sys.argv[2])
try:
mode = params['mode'][0] mode = params['mode'][0]
id = params.get('id', None) id = params.get('id', None)
if id: if id:
id = id[0] id = id[0]
except: except:
params = {} params = {}
mode = "" mode = ""
##### PLAY ITEM VIA plugin://plugin.video.emby/ ##### ##### PLAY ITEM VIA plugin://plugin.video.emby/ #####
if "play" in mode or "playnow" in mode: if "play" in mode or "playnow" in mode:
entrypoint.doPlayback(id) entrypoint.doPlayback(id)
#### DO RESET AUTH ##### #### DO RESET AUTH #####
elif "resetauth" in mode: elif "resetauth" in mode:
entrypoint.resetAuth() entrypoint.resetAuth()
##### DO DATABASE RESET ##### ##### DO DATABASE RESET #####
elif "reset" in mode: elif "reset" in mode:
import Utils as utils import Utils as utils
utils.reset() utils.reset()
##### ADD/REMOVE USER FROM SESSION ##### ##### ADD/REMOVE USER FROM SESSION #####
elif "adduser" in mode: elif "adduser" in mode:
entrypoint.addUser() entrypoint.addUser()
##### SYNC THEME MEDIA ##### ##### SYNC THEME MEDIA #####
elif "thememedia" in mode: elif "thememedia" in mode:
entrypoint.getThemeMedia() entrypoint.getThemeMedia()
##### LAUNCH EMBY USER PREFS ##### ##### LAUNCH EMBY USER PREFS #####
elif "userprefs" in mode: elif "userprefs" in mode:
entrypoint.userPreferences() entrypoint.userPreferences()
##### OPEN ADDON SETTINGS ##### ##### OPEN ADDON SETTINGS #####
elif "settings" in mode: elif "settings" in mode:
xbmc.executebuiltin('Addon.OpenSettings(plugin.video.emby)') xbmc.executebuiltin('Addon.OpenSettings(plugin.video.emby)')
##### MANUALLY SYNC LIBRARY ##### ##### MANUALLY SYNC LIBRARY #####
elif "manualsync" in mode: elif "manualsync" in mode:
from LibrarySync import LibrarySync from LibrarySync import LibrarySync
LibrarySync().FullLibrarySync(True) LibrarySync().FullLibrarySync(True)
##### CACHE ARTWORK ##### ##### CACHE ARTWORK #####
elif "texturecache" in mode: elif "texturecache" in mode:
from TextureCache import TextureCache from TextureCache import TextureCache
TextureCache().FullTextureCacheSync() TextureCache().FullTextureCacheSync()
##### BROWSE EMBY CHANNELS FOLDER ##### ##### BROWSE EMBY CHANNELS FOLDER #####
elif "channelsfolder" in mode: elif "channelsfolder" in mode:
folderid = params['folderid'][0] folderid = params['folderid'][0]
entrypoint.BrowseChannels(id,folderid) entrypoint.BrowseChannels(id,folderid)
##### BROWSE EMBY CHANNELS ROOT ##### ##### BROWSE EMBY CHANNELS ROOT #####
elif "channels" in mode: elif "channels" in mode:
entrypoint.BrowseChannels(id) entrypoint.BrowseChannels(id)
##### GET NEXTUP EPISODES FOR TAGNAME ##### ##### GET NEXTUP EPISODES FOR TAGNAME #####
elif "nextup" in mode: elif "nextup" in mode:
limit = params['limit'][0] limit = params['limit'][0]
entrypoint.getNextUpEpisodes(id, limit) entrypoint.getNextUpEpisodes(id, limit)
##### GET INPROGRESS EPISODES FOR TAGNAME ##### ##### GET INPROGRESS EPISODES FOR TAGNAME #####
elif "inprogressepisodes" in mode: elif "inprogressepisodes" in mode:
limit = params['limit'][0] limit = params['limit'][0]
entrypoint.getInProgressEpisodes(id, limit) entrypoint.getInProgressEpisodes(id, limit)
##### GET RECENT EPISODES FOR TAGNAME ##### ##### GET RECENT EPISODES FOR TAGNAME #####
elif "recentepisodes" in mode: elif "recentepisodes" in mode:
limit = params['limit'][0] limit = params['limit'][0]
entrypoint.getRecentEpisodes(id, limit) entrypoint.getRecentEpisodes(id, limit)
##### GET EXTRAFANART FOR LISTITEM ##### ##### GET EXTRAFANART FOR LISTITEM #####
elif "extrafanart" in sys.argv[0]: elif "extrafanart" in sys.argv[0]:
entrypoint.getExtraFanArt() entrypoint.getExtraFanArt()
##### SHOW ADDON NODES LISTING ##### ##### SHOW ADDON NODES LISTING #####
if not mode: if not mode:
entrypoint.doMainListing() entrypoint.doMainListing()
if ( __name__ == "__main__" ):
xbmc.log('plugin.video.emby started')
if enableProfiling:
import cProfile
import pstats
import random
from time import gmtime, strftime
addonid = addon_.getAddonInfo('id').decode( 'utf-8' )
datapath = os.path.join( xbmc.translatePath( "special://profile/" ).decode( 'utf-8' ), "addon_data", addonid )
filename = os.path.join( datapath, strftime( "%Y%m%d%H%M%S",gmtime() ) + "-" + str( random.randrange(0,100000) ) + ".log" )
cProfile.run( 'Main()', filename )
stream = open( filename + ".txt", 'w')
p = pstats.Stats( filename, stream = stream )
p.sort_stats( "cumulative" )
p.print_stats()
else:
Main()
xbmc.log('plugin.video.emby stopped')

View file

@ -437,6 +437,21 @@ def BrowseChannels(id, folderid=None):
##### GET NEXTUP EPISODES FOR TAGNAME ##### ##### GET NEXTUP EPISODES FOR TAGNAME #####
def getNextUpEpisodes(tagname,limit): def getNextUpEpisodes(tagname,limit):
count=0
#try to load from cache first
win = xbmcgui.Window( 10000 )
data = win.getProperty("emby.widget.nextup." + tagname)
if data and not win.getProperty("clearwidgetcache") == "clear":
data = json.loads(data)
for item in data:
liz = createListItem(item)
xbmcplugin.addDirectoryItem(handle=int(sys.argv[1]), url=item['file'], listitem=liz)
xbmcplugin.endOfDirectory(handle=int(sys.argv[1]))
else:
episodes = list()
addonSettings = xbmcaddon.Addon(id='plugin.video.emby')
win.clearProperty("clearwidgetcache")
#if the addon is called with nextup parameter, we return the nextepisodes list of the given tagname #if the addon is called with nextup parameter, we return the nextepisodes list of the given tagname
xbmcplugin.setContent(int(sys.argv[1]), 'episodes') xbmcplugin.setContent(int(sys.argv[1]), 'episodes')
# First we get a list of all the in-progress TV shows - filtered by tag # First we get a list of all the in-progress TV shows - filtered by tag
@ -446,32 +461,33 @@ def getNextUpEpisodes(tagname,limit):
# If we found any, find the oldest unwatched show for each one. # If we found any, find the oldest unwatched show for each one.
if json_result.has_key('result') and json_result['result'].has_key('tvshows'): if json_result.has_key('result') and json_result['result'].has_key('tvshows'):
for item in json_result['result']['tvshows']: for item in json_result['result']['tvshows']:
addonSettings = xbmcaddon.Addon(id='plugin.video.emby')
# If Ignore Specials is true only choose episodes from seasons greater than 0. # If Ignore Specials is true only choose episodes from seasons greater than 0.
if addonSettings.getSetting("ignoreSpecialsNextEpisodes")=="true": if addonSettings.getSetting("ignoreSpecialsNextEpisodes")=="true":
json_query2 = xbmc.executeJSONRPC('{"jsonrpc": "2.0", "method": "VideoLibrary.GetEpisodes", "params": { "tvshowid": %d, "sort": {"method":"episode"}, "filter": {"and": [ {"field": "playcount", "operator": "lessthan", "value":"1"}, {"field": "season", "operator": "greaterthan", "value": "0"} ]}, "properties": [ "title", "playcount", "season", "episode", "showtitle", "plot", "file", "rating", "resume", "tvshowid", "art", "streamdetails", "firstaired", "runtime", "writer", "cast", "dateadded", "lastplayed" ], "limits":{"end":1}}, "id": "1"}' %item['tvshowid']) json_query2 = xbmc.executeJSONRPC('{"jsonrpc": "2.0", "method": "VideoLibrary.GetEpisodes", "params": { "tvshowid": %d, "sort": {"method":"episode"}, "filter": {"and": [ {"field": "playcount", "operator": "lessthan", "value":"1"}, {"field": "season", "operator": "greaterthan", "value": "0"} ]}, "properties": [ "title", "playcount", "season", "episode", "showtitle", "plot", "file", "rating", "resume", "tvshowid", "art", "streamdetails", "firstaired", "runtime", "writer", "dateadded", "lastplayed" ], "limits":{"end":1}}, "id": "1"}' %item['tvshowid'])
else: else:
json_query2 = xbmc.executeJSONRPC('{"jsonrpc": "2.0", "method": "VideoLibrary.GetEpisodes", "params": { "tvshowid": %d, "sort": {"method":"episode"}, "filter": {"field": "playcount", "operator": "lessthan", "value":"1"}, "properties": [ "title", "playcount", "season", "episode", "showtitle", "plot", "file", "rating", "resume", "tvshowid", "art", "streamdetails", "firstaired", "runtime", "writer", "cast", "dateadded", "lastplayed" ], "limits":{"end":1}}, "id": "1"}' %item['tvshowid']) json_query2 = xbmc.executeJSONRPC('{"jsonrpc": "2.0", "method": "VideoLibrary.GetEpisodes", "params": { "tvshowid": %d, "sort": {"method":"episode"}, "filter": {"field": "playcount", "operator": "lessthan", "value":"1"}, "properties": [ "title", "playcount", "season", "episode", "showtitle", "plot", "file", "rating", "resume", "tvshowid", "art", "streamdetails", "firstaired", "runtime", "writer", "dateadded", "lastplayed" ], "limits":{"end":1}}, "id": "1"}' %item['tvshowid'])
if json_query2: if json_query2:
json_query2 = json.loads(json_query2) json_query2 = json.loads(json_query2)
if json_query2.has_key('result') and json_query2['result'].has_key('episodes'): if json_query2.has_key('result') and json_query2['result'].has_key('episodes'):
count = 0
for item in json_query2['result']['episodes']: for item in json_query2['result']['episodes']:
liz = createListItem(item) liz = createListItem(item)
episodes.append(item)
xbmcplugin.addDirectoryItem(handle=int(sys.argv[1]), url=item['file'], listitem=liz) xbmcplugin.addDirectoryItem(handle=int(sys.argv[1]), url=item['file'], listitem=liz)
count +=1 count +=1
if count == limit: if count == limit:
break break
#use window prop as cache
win.setProperty("emby.widget.nextup." + tagname, json.dumps(episodes))
xbmcplugin.endOfDirectory(handle=int(sys.argv[1])) xbmcplugin.endOfDirectory(handle=int(sys.argv[1]))
def getInProgressEpisodes(tagname,limit): def getInProgressEpisodes(tagname,limit):
count = 0
#if the addon is called with inprogressepisodes parameter, we return the inprogressepisodes list of the given tagname #if the addon is called with inprogressepisodes parameter, we return the inprogressepisodes list of the given tagname
xbmcplugin.setContent(int(sys.argv[1]), 'episodes') xbmcplugin.setContent(int(sys.argv[1]), 'episodes')
# First we get a list of all the in-progress TV shows - filtered by tag # First we get a list of all the in-progress TV shows - filtered by tag
json_query_string = xbmc.executeJSONRPC('{"jsonrpc": "2.0", "method": "VideoLibrary.GetTVShows", "params": { "sort": { "order": "descending", "method": "lastplayed" }, "filter": {"and": [{"operator":"true", "field":"inprogress", "value":""}, {"operator": "contains", "field": "tag", "value": "%s"}]}, "properties": [ "title", "studio", "mpaa", "file", "art" ] }, "id": "libTvShows"}' %tagname) json_query_string = xbmc.executeJSONRPC('{"jsonrpc": "2.0", "method": "VideoLibrary.GetTVShows", "params": { "sort": { "order": "descending", "method": "lastplayed" }, "filter": {"and": [{"operator":"true", "field":"inprogress", "value":""}, {"operator": "contains", "field": "tag", "value": "%s"}]}, "properties": [ "title", "studio", "mpaa", "file", "art" ] }, "id": "libTvShows"}' %tagname)
json_result = json.loads(json_query_string) json_result = json.loads(json_query_string)
# If we found any, find all in progress episodes for each one. # If we found any, find all in progress episodes for each one.
if json_result.has_key('result') and json_result['result'].has_key('tvshows'): if json_result.has_key('result') and json_result['result'].has_key('tvshows'):
@ -481,7 +497,6 @@ def getInProgressEpisodes(tagname,limit):
if json_query2: if json_query2:
json_query2 = json.loads(json_query2) json_query2 = json.loads(json_query2)
if json_query2.has_key('result') and json_query2['result'].has_key('episodes'): if json_query2.has_key('result') and json_query2['result'].has_key('episodes'):
count = 0
for item in json_query2['result']['episodes']: for item in json_query2['result']['episodes']:
liz = createListItem(item) liz = createListItem(item)
xbmcplugin.addDirectoryItem(handle=int(sys.argv[1]), url=item['file'], listitem=liz) xbmcplugin.addDirectoryItem(handle=int(sys.argv[1]), url=item['file'], listitem=liz)
@ -515,7 +530,7 @@ def getRecentEpisodes(tagname,limit):
liz = createListItem(item) liz = createListItem(item)
xbmcplugin.addDirectoryItem(handle=int(sys.argv[1]), url=item['file'], listitem=liz) xbmcplugin.addDirectoryItem(handle=int(sys.argv[1]), url=item['file'], listitem=liz)
count += 1 count += 1
if count >= limit: if count == limit:
break break
xbmcplugin.endOfDirectory(handle=int(sys.argv[1])) xbmcplugin.endOfDirectory(handle=int(sys.argv[1]))

View file

@ -153,6 +153,6 @@ class Kodi_Monitor(xbmc.Monitor):
self.WINDOW.clearProperty("Played%s%s" % (type,id)) self.WINDOW.clearProperty("Played%s%s" % (type,id))
self.WINDOW.clearProperty('played_skipWatched') self.WINDOW.clearProperty('played_skipWatched')
#clear the widget cache
self.WINDOW.setProperty('clearwidgetcache','clear')