diff --git a/resources/lib/LibrarySync.py b/resources/lib/LibrarySync.py index b6677aa5..5b87df70 100644 --- a/resources/lib/LibrarySync.py +++ b/resources/lib/LibrarySync.py @@ -50,7 +50,11 @@ class LibrarySync(): #what sync method to perform ? if syncOption == "Full Sync": + + pr = utils.startProfiling() self.MoviesSync(True) + utils.stopProfiling(pr, "MoviesSync(True)") + self.TvShowsSync(True) if syncOption == "Incremental Sync": self.MoviesSync(False) diff --git a/resources/lib/Utils.py b/resources/lib/Utils.py index 4887fac5..1d0701b5 100644 --- a/resources/lib/Utils.py +++ b/resources/lib/Utils.py @@ -8,7 +8,9 @@ import xbmcaddon import xbmcvfs import json import os - +import cProfile +import pstats +import time import sqlite3 import inspect from xml.etree.ElementTree import Element, SubElement, Comment, tostring @@ -24,11 +26,9 @@ addonSettings = xbmcaddon.Addon(id='plugin.video.mb3sync') language = addonSettings.getLocalizedString def logMsg(title, msg, level = 1): - logLevel = int(addonSettings.getSetting("logLevel")) - if(logLevel >= level): - if(logLevel == 1): + if(logLevel == 2): # inspect.stack() is expensive try: xbmc.log(title + " -> " + inspect.stack()[1][3] + " : " + str(msg)) except UnicodeEncodeError: @@ -195,5 +195,35 @@ def get_params( paramstring ): param[splitparams[0]]=splitparams[1]+"="+splitparams[2] return param +def startProfiling(): + pr = cProfile.Profile() + pr.enable() + return pr + +def stopProfiling(pr, profileName): + pr.disable() + ps = pstats.Stats(pr) + + addondir = xbmc.translatePath(xbmcaddon.Addon(id='plugin.video.mb3sync').getAddonInfo('profile')) + + fileTimeStamp = time.strftime("%Y-%m-%d %H-%M-%S") + tabFileNamepath = os.path.join(addondir, "profiles") + tabFileName = os.path.join(addondir, "profiles" , profileName + "_profile_(" + fileTimeStamp + ").tab") + + if not xbmcvfs.exists(tabFileNamepath): + xbmcvfs.mkdir(tabFileNamepath) + + f = open(tabFileName, 'wb') + f.write("NumbCalls\tTotalTime\tCumulativeTime\tFunctionName\tFileName\r\n") + for (key, value) in ps.stats.items(): + (filename, count, func_name) = key + (ccalls, ncalls, total_time, cumulative_time, callers) = value + try: + f.write(str(ncalls) + "\t" + "{:10.4f}".format(total_time) + "\t" + "{:10.4f}".format(cumulative_time) + "\t" + func_name + "\t" + filename + "\r\n") + except ValueError: + f.write(str(ncalls) + "\t" + "{0}".format(total_time) + "\t" + "{0}".format(cumulative_time) + "\t" + func_name + "\t" + filename + "\r\n") + f.close() + + \ No newline at end of file diff --git a/resources/lib/WriteKodiDB.py b/resources/lib/WriteKodiDB.py index 02d6147e..38997626 100644 --- a/resources/lib/WriteKodiDB.py +++ b/resources/lib/WriteKodiDB.py @@ -94,49 +94,49 @@ class WriteKodiDB(): changes = False #update artwork - changes = self.updateArtWork(KodiItem,"poster", API().getArtwork(MBitem, "poster"),"movie") - changes = self.updateArtWork(KodiItem,"clearlogo", API().getArtwork(MBitem, "Logo"),"movie") - changes = self.updateArtWork(KodiItem,"clearart", API().getArtwork(MBitem, "Art"),"movie") - changes = self.updateArtWork(KodiItem,"banner", API().getArtwork(MBitem, "Banner"),"movie") - changes = self.updateArtWork(KodiItem,"landscape", API().getArtwork(MBitem, "Thumb"),"movie") - changes = self.updateArtWork(KodiItem,"discart", API().getArtwork(MBitem, "Disc"),"movie") - changes = self.updateArtWork(KodiItem,"fanart", API().getArtwork(MBitem, "Backdrop"),"movie") - + changes |= self.updateArtWork(KodiItem,"poster", API().getArtwork(MBitem, "poster"),"movie") + changes |= self.updateArtWork(KodiItem,"clearlogo", API().getArtwork(MBitem, "Logo"),"movie") + changes |= self.updateArtWork(KodiItem,"clearart", API().getArtwork(MBitem, "Art"),"movie") + changes |= self.updateArtWork(KodiItem,"banner", API().getArtwork(MBitem, "Banner"),"movie") + changes |= self.updateArtWork(KodiItem,"landscape", API().getArtwork(MBitem, "Thumb"),"movie") + changes |= self.updateArtWork(KodiItem,"discart", API().getArtwork(MBitem, "Disc"),"movie") + changes |= self.updateArtWork(KodiItem,"fanart", API().getArtwork(MBitem, "Backdrop"),"movie") + #update common properties duration = (int(timeInfo.get('Duration'))*60) - changes = self.updateProperty(KodiItem,"runtime",duration,"movie") - changes = self.updateProperty(KodiItem,"year",MBitem.get("ProductionYear"),"movie") - changes = self.updateProperty(KodiItem,"mpaa",MBitem.get("OfficialRating"),"movie") - - changes = self.updatePropertyArray(KodiItem,"tag",MBitem.get("Tag"),"movie") + changes |= self.updateProperty(KodiItem,"runtime",duration,"movie") + changes |= self.updateProperty(KodiItem,"year",MBitem.get("ProductionYear"),"movie") + changes |= self.updateProperty(KodiItem,"mpaa",MBitem.get("OfficialRating"),"movie") + + changes |= self.updatePropertyArray(KodiItem,"tag",MBitem.get("Tag"),"movie") if MBitem.get("CriticRating") != None: - changes = self.updateProperty(KodiItem,"rating",int(MBitem.get("CriticRating"))/10,"movie") - - changes = self.updateProperty(KodiItem,"plotoutline",MBitem.get("ShortOverview"),"movie") - changes = self.updateProperty(KodiItem,"set",MBitem.get("TmdbCollectionName"),"movie") - changes = self.updateProperty(KodiItem,"sorttitle",MBitem.get("SortName"),"movie") - + changes |= self.updateProperty(KodiItem,"rating",int(MBitem.get("CriticRating"))/10,"movie") + + changes |= self.updateProperty(KodiItem,"plotoutline",MBitem.get("ShortOverview"),"movie") + changes |= self.updateProperty(KodiItem,"set",MBitem.get("TmdbCollectionName"),"movie") + changes |= self.updateProperty(KodiItem,"sorttitle",MBitem.get("SortName"),"movie") + if MBitem.get("ProviderIds") != None: if MBitem.get("ProviderIds").get("Imdb") != None: - changes = self.updateProperty(KodiItem,"imdbnumber",MBitem.get("ProviderIds").get("Imdb"),"movie") - + changes |= self.updateProperty(KodiItem,"imdbnumber",MBitem.get("ProviderIds").get("Imdb"),"movie") + # FIXME --> Taglines not returned by MB3 server !? if MBitem.get("TagLines") != None: - changes = self.updateProperty(KodiItem,"tagline",MBitem.get("TagLines")[0],"movie") - - changes = self.updatePropertyArray(KodiItem,"writer",people.get("Writer"),"movie") - changes = self.updatePropertyArray(KodiItem,"director",people.get("Director"),"movie") - changes = self.updatePropertyArray(KodiItem,"genre",MBitem.get("Genres"),"movie") + changes |= self.updateProperty(KodiItem,"tagline",MBitem.get("TagLines")[0],"movie") + changes |= self.updatePropertyArray(KodiItem,"writer",people.get("Writer"),"movie") + changes |= self.updatePropertyArray(KodiItem,"director",people.get("Director"),"movie") + changes |= self.updatePropertyArray(KodiItem,"genre",MBitem.get("Genres"),"movie") + if(studios != None): for x in range(0, len(studios)): studios[x] = studios[x].replace("/", "&") - changes = self.updatePropertyArray(KodiItem,"studio",studios,"movie") + changes |= self.updatePropertyArray(KodiItem,"studio",studios,"movie") # FIXME --> ProductionLocations not returned by MB3 server !? - self.updatePropertyArray(KodiItem,"country",MBitem.get("ProductionLocations"),"movie") - + changes |= self.updatePropertyArray(KodiItem,"country",MBitem.get("ProductionLocations"),"movie") + #trailer link trailerUrl = None if MBitem.get("LocalTrailerCount") != None and MBitem.get("LocalTrailerCount") > 0: @@ -145,10 +145,10 @@ class WriteKodiDB(): if(jsonData != ""): trailerItem = json.loads(jsonData) trailerUrl = "plugin://plugin.video.mb3sync/?id=" + trailerItem[0].get("Id") + '&mode=play' - changes = self.updateProperty(KodiItem,"trailer",trailerUrl,"movie") - + changes |= self.updateProperty(KodiItem,"trailer",trailerUrl,"movie") + #add actors - self.AddActorsToMedia(KodiItem,MBitem.get("People"),"movie") + changes |= self.AddActorsToMedia(KodiItem,MBitem.get("People"),"movie") CreateFiles().createSTRM(MBitem) CreateFiles().createNFO(MBitem) @@ -299,14 +299,15 @@ class WriteKodiDB(): curValue = urllib.unquote(KodiItem['art'][artWorkName]).decode('utf8') if not artworkValue in curValue: xbmc.sleep(sleepVal) - utils.logMsg("MB3 Syncer","updating artwork..." + str(artworkValue) + " - " + str(curValue)) + utils.logMsg("MB3 Syncer", "updating artwork..." + str(artworkValue) + " - " + str(curValue)) xbmc.executeJSONRPC(jsoncommand %(id, artWorkName, artworkValue)) changes = True - elif artworkValue != None: + elif artworkValue != None and artworkValue != "": xbmc.sleep(sleepVal) + utils.logMsg("MB3 Syncer", "updating artwork..." + str(artworkValue) + " - " + str(artWorkName)) xbmc.executeJSONRPC(jsoncommand %(id, artWorkName, artworkValue)) changes = True - + return changes # adds or updates the given property on the videofile in Kodi database @@ -391,7 +392,7 @@ class WriteKodiDB(): changes = CreateFiles().createNFO(item) # create strm file - changes = CreateFiles().createSTRM(item) + changes |= CreateFiles().createSTRM(item) if changes: utils.logMsg("MB3 Sync","Added movie to Kodi Library",item["Id"] + " - " + item["Name"]) @@ -404,7 +405,7 @@ class WriteKodiDB(): changes = CreateFiles().createNFO(item) # create strm file - changes = CreateFiles().createSTRM(item) + changes |= CreateFiles().createSTRM(item) if changes: utils.logMsg("MB3 Sync","Added episode to Kodi Library",item["Id"] + " - " + item["Name"]) @@ -482,7 +483,6 @@ class WriteKodiDB(): if mediatype == "episode": id = KodiItem["episodeid"] - dbPath = xbmc.translatePath("special://userdata/Database/MyVideos90.db") connection = sqlite3.connect(dbPath) cursor = connection.cursor() @@ -491,7 +491,9 @@ class WriteKodiDB(): if KodiItem["cast"] != None: for cast in KodiItem["cast"]: currentcast.append(cast["name"]) - + + changes = False + if(people != None): for person in people: if(person.get("Type") == "Actor"): @@ -518,6 +520,8 @@ class WriteKodiDB(): if mediatype == "episode": peoplesql="INSERT OR REPLACE into actorlinkepisode(idActor, idEpisode, strRole, iOrder) values(?, ?, ?, ?)" cursor.execute(peoplesql, (actorid,id,Role,None)) + changes = True connection.commit() cursor.close() + return changes diff --git a/service.py b/service.py index f46ba4bc..746617ae 100644 --- a/service.py +++ b/service.py @@ -25,7 +25,7 @@ class Service(): def __init__(self, *args ): self.KodiMonitor = KodiMonitor.Kodi_Monitor() - utils.logMsg("MB3 Sync Service" "starting Monitor",0) + utils.logMsg("MB3 Sync Service", "starting Monitor",0) pass @@ -115,7 +115,7 @@ class Service(): else: xbmc.log("Not authenticated yet") - utils.logMsg("MB3 Sync Service" "stopping Service",0) + utils.logMsg("MB3 Sync Service", "stopping Service",0) #start the service