From 4d0d863a424514b5b1b87a7b075b7722f0f7261a Mon Sep 17 00:00:00 2001 From: Marcel van der Veldt Date: Thu, 7 May 2015 10:32:30 +0200 Subject: [PATCH] fixes issue with user profile switches in kodi --- resources/lib/VideoNodes.py | 234 ++++++++++++++++++------------------ service.py | 11 ++ 2 files changed, 125 insertions(+), 120 deletions(-) diff --git a/resources/lib/VideoNodes.py b/resources/lib/VideoNodes.py index d9ffd1f0..33c7136d 100644 --- a/resources/lib/VideoNodes.py +++ b/resources/lib/VideoNodes.py @@ -10,10 +10,7 @@ import xbmcvfs import json import os import shutil -from xml.etree.ElementTree import Element, SubElement, Comment, tostring -from xml.etree import ElementTree -from xml.dom import minidom -import xml.etree.cElementTree as ET +import xml.etree.ElementTree as etree import Utils as utils @@ -35,184 +32,181 @@ class VideoNodes(): #create tag node - index xbmcvfs.mkdir(libraryPath) nodefile = os.path.join(libraryPath, "index.xml") - root = Element("node", {"order":"0"}) - SubElement(root, "label").text = "Emby - " + tagname - SubElement(root, "icon").text = "special://home/addons/plugin.video.emby/icon.png" + root = etree.Element("node", {"order":"0"}) + etree.SubElement(root, "label").text = "Emby - " + tagname + etree.SubElement(root, "icon").text = "special://home/addons/plugin.video.emby/icon.png" path = "library://video/Emby - %s/"%tagname WINDOW.setProperty("Emby.nodes.%s.index" %str(windowPropId),path) - try: - ET.ElementTree(root).write(nodefile, xml_declaration=True) - except: - ET.ElementTree(root).write(nodefile) + etree.ElementTree(root).write(nodefile) #create tag node - all items nodefile = os.path.join(libraryPath, tagname + "_all.xml") - root = Element("node", {"order":"1", "type":"filter"}) - SubElement(root, "label").text = tagname - SubElement(root, "match").text = "all" - SubElement(root, "content").text = type - SubElement(root, "icon").text = "special://home/addons/plugin.video.emby/icon.png" - SubElement(root, "order", {"direction":"ascending"}).text = "sorttitle" - Rule = SubElement(root, "rule", {"field":"tag","operator":"is"}) + root = etree.Element("node", {"order":"1", "type":"filter"}) + etree.SubElement(root, "label").text = tagname + etree.SubElement(root, "match").text = "all" + etree.SubElement(root, "content").text = type + etree.SubElement(root, "icon").text = "special://home/addons/plugin.video.emby/icon.png" + etree.SubElement(root, "order", {"direction":"ascending"}).text = "sorttitle" + Rule = etree.SubElement(root, "rule", {"field":"tag","operator":"is"}) WINDOW.setProperty("Emby.nodes.%s.title" %str(windowPropId),tagname) path = "library://video/Emby - %s/%s_all.xml"%(tagname,tagname) WINDOW.setProperty("Emby.nodes.%s.path" %str(windowPropId),"ActivateWindow(Video,%s,return)"%path) WINDOW.setProperty("Emby.nodes.%s.content" %str(windowPropId),path) WINDOW.setProperty("Emby.nodes.%s.type" %str(windowPropId),type) - SubElement(Rule, "value").text = tagname + etree.SubElement(Rule, "value").text = tagname try: - ET.ElementTree(root).write(nodefile, xml_declaration=True) + etree.ElementTree(root).write(nodefile, xml_declaration=True) except: - ET.ElementTree(root).write(nodefile) + etree.ElementTree(root).write(nodefile) #create tag node - recent items nodefile = os.path.join(libraryPath, tagname + "_recent.xml") - root = Element("node", {"order":"2", "type":"filter"}) + root = etree.Element("node", {"order":"2", "type":"filter"}) if type == "tvshows": label = tagname + " - " + language(30170) else: label = tagname + " - " + language(30174) - SubElement(root, "label").text = label - SubElement(root, "match").text = "all" - SubElement(root, "content").text = type - SubElement(root, "icon").text = "special://home/addons/plugin.video.emby/icon.png" - Rule = SubElement(root, "rule", {"field":"tag","operator":"is"}) - SubElement(Rule, "value").text = tagname - SubElement(root, "order", {"direction":"descending"}).text = "dateadded" + etree.SubElement(root, "label").text = label + etree.SubElement(root, "match").text = "all" + etree.SubElement(root, "content").text = type + etree.SubElement(root, "icon").text = "special://home/addons/plugin.video.emby/icon.png" + Rule = etree.SubElement(root, "rule", {"field":"tag","operator":"is"}) + etree.SubElement(Rule, "value").text = tagname + etree.SubElement(root, "order", {"direction":"descending"}).text = "dateadded" #set limit to 25 --> currently hardcoded --> TODO: add a setting for this ? - SubElement(root, "limit").text = "25" + etree.SubElement(root, "limit").text = "25" #exclude watched items --> currently hardcoded --> TODO: add a setting for this ? - Rule2 = SubElement(root, "rule", {"field":"playcount","operator":"is"}) - SubElement(Rule2, "value").text = "0" + Rule2 = etree.SubElement(root, "rule", {"field":"playcount","operator":"is"}) + etree.SubElement(Rule2, "value").text = "0" WINDOW.setProperty("Emby.nodes.%s.recent.title" %str(windowPropId),label) path = "library://video/Emby - %s/%s_recent.xml"%(tagname,tagname) WINDOW.setProperty("Emby.nodes.%s.recent.path" %str(windowPropId),"ActivateWindow(Video,%s,return)"%path) WINDOW.setProperty("Emby.nodes.%s.recent.content" %str(windowPropId),path) try: - ET.ElementTree(root).write(nodefile, xml_declaration=True) + etree.ElementTree(root).write(nodefile, xml_declaration=True) except: - ET.ElementTree(root).write(nodefile) + etree.ElementTree(root).write(nodefile) #create tag node - inprogress items nodefile = os.path.join(libraryPath, tagname + "_progress.xml") - root = Element("node", {"order":"3", "type":"filter"}) + root = etree.Element("node", {"order":"3", "type":"filter"}) if type == "tvshows": label = tagname + " - " + language(30171) else: label = tagname + " - " + language(30177) - SubElement(root, "label").text = label - SubElement(root, "match").text = "all" - SubElement(root, "content").text = type - SubElement(root, "icon").text = "special://home/addons/plugin.video.emby/icon.png" - Rule = SubElement(root, "rule", {"field":"tag","operator":"is"}) - SubElement(Rule, "value").text = tagname + etree.SubElement(root, "label").text = label + etree.SubElement(root, "match").text = "all" + etree.SubElement(root, "content").text = type + etree.SubElement(root, "icon").text = "special://home/addons/plugin.video.emby/icon.png" + Rule = etree.SubElement(root, "rule", {"field":"tag","operator":"is"}) + etree.SubElement(Rule, "value").text = tagname #set limit to 25 --> currently hardcoded --> TODO: add a setting for this ? - SubElement(root, "limit").text = "25" - Rule2 = SubElement(root, "rule", {"field":"inprogress","operator":"true"}) + etree.SubElement(root, "limit").text = "25" + Rule2 = etree.SubElement(root, "rule", {"field":"inprogress","operator":"true"}) WINDOW.setProperty("Emby.nodes.%s.inprogress.title" %str(windowPropId),label) path = "library://video/Emby - %s/%s_progress.xml"%(tagname,tagname) WINDOW.setProperty("Emby.nodes.%s.inprogress.path" %str(windowPropId),"ActivateWindow(Video,%s,return)"%path) WINDOW.setProperty("Emby.nodes.%s.inprogress.content" %str(windowPropId),path) try: - ET.ElementTree(root).write(nodefile, xml_declaration=True) + etree.ElementTree(root).write(nodefile, xml_declaration=True) except: - ET.ElementTree(root).write(nodefile) + etree.ElementTree(root).write(nodefile) #create tag node - add unwatched movies node for movies if type == "movies": nodefile = os.path.join(libraryPath, tagname + "_unwatched.xml") - root = Element("node", {"order":"4", "type":"filter"}) + root = etree.Element("node", {"order":"4", "type":"filter"}) label = tagname + " - " + language(30189) - SubElement(root, "label").text = label - SubElement(root, "match").text = "all" - SubElement(root, "content").text = "movies" - SubElement(root, "icon").text = "special://home/addons/plugin.video.emby/icon.png" - Rule = SubElement(root, "rule", {"field":"tag","operator":"is"}) - SubElement(Rule, "value").text = tagname - Rule = SubElement(root, "rule", {"field":"playcount","operator":"is"}) - SubElement(Rule, "value").text = "0" - SubElement(root, "order", {"direction":"ascending"}).text = "sorttitle" + etree.SubElement(root, "label").text = label + etree.SubElement(root, "match").text = "all" + etree.SubElement(root, "content").text = "movies" + etree.SubElement(root, "icon").text = "special://home/addons/plugin.video.emby/icon.png" + Rule = etree.SubElement(root, "rule", {"field":"tag","operator":"is"}) + etree.SubElement(Rule, "value").text = tagname + Rule = etree.SubElement(root, "rule", {"field":"playcount","operator":"is"}) + etree.SubElement(Rule, "value").text = "0" + etree.SubElement(root, "order", {"direction":"ascending"}).text = "sorttitle" #set limit to 25 --> currently hardcoded --> TODO: add a setting for this ? - SubElement(root, "limit").text = "25" + etree.SubElement(root, "limit").text = "25" #exclude watched items --> currently hardcoded --> TODO: add a setting for this ? - Rule2 = SubElement(root, "rule", {"field":"playcount","operator":"is"}) - SubElement(Rule2, "value").text = "0" + Rule2 = etree.SubElement(root, "rule", {"field":"playcount","operator":"is"}) + etree.SubElement(Rule2, "value").text = "0" WINDOW.setProperty("Emby.nodes.%s.unwatched.title" %str(windowPropId),label) path = "library://video/Emby - %s/%s_unwatched.xml"%(tagname,tagname) WINDOW.setProperty("Emby.nodes.%s.unwatched.path" %str(windowPropId),"ActivateWindow(Video,%s,return)"%path) WINDOW.setProperty("Emby.nodes.%s.unwatched.content" %str(windowPropId),path) try: - ET.ElementTree(root).write(nodefile, xml_declaration=True) + etree.ElementTree(root).write(nodefile, xml_declaration=True) except: - ET.ElementTree(root).write(nodefile) + etree.ElementTree(root).write(nodefile) #add some additional nodes for episodes if type == "tvshows": #create tag node - recent episodes nodefile = os.path.join(libraryPath, tagname + "_recent_episodes.xml") - root = Element("node", {"order":"3", "type":"filter"}) + root = etree.Element("node", {"order":"3", "type":"filter"}) label = tagname + " - " + language(30175) - SubElement(root, "label").text = label - SubElement(root, "match").text = "all" - SubElement(root, "content").text = "episodes" - SubElement(root, "icon").text = "special://home/addons/plugin.video.emby/icon.png" - Rule = SubElement(root, "rule", {"field":"tag","operator":"is"}) - SubElement(Rule, "value").text = tagname - SubElement(root, "order", {"direction":"descending"}).text = "dateadded" + etree.SubElement(root, "label").text = label + etree.SubElement(root, "match").text = "all" + etree.SubElement(root, "content").text = "episodes" + etree.SubElement(root, "icon").text = "special://home/addons/plugin.video.emby/icon.png" + Rule = etree.SubElement(root, "rule", {"field":"tag","operator":"is"}) + etree.SubElement(Rule, "value").text = tagname + etree.SubElement(root, "order", {"direction":"descending"}).text = "dateadded" #set limit to 25 --> currently hardcoded --> TODO: add a setting for this ? - SubElement(root, "limit").text = "25" + etree.SubElement(root, "limit").text = "25" #exclude watched items --> currently hardcoded --> TODO: add a setting for this ? - Rule2 = SubElement(root, "rule", {"field":"playcount","operator":"is"}) - SubElement(Rule2, "value").text = "0" + Rule2 = etree.SubElement(root, "rule", {"field":"playcount","operator":"is"}) + etree.SubElement(Rule2, "value").text = "0" WINDOW.setProperty("Emby.nodes.%s.recentepisodes.title" %str(windowPropId),label) path = "library://video/Emby - %s/%s_recent_episodes.xml"%(tagname,tagname) WINDOW.setProperty("Emby.nodes.%s.recentepisodes.path" %str(windowPropId),"ActivateWindow(Video,%s,return)"%path) WINDOW.setProperty("Emby.nodes.%s.recentepisodes.content" %str(windowPropId),path) try: - ET.ElementTree(root).write(nodefile, xml_declaration=True) + etree.ElementTree(root).write(nodefile, xml_declaration=True) except: - ET.ElementTree(root).write(nodefile) + etree.ElementTree(root).write(nodefile) #create tag node - inprogress items nodefile = os.path.join(libraryPath, tagname + "_progress_episodes.xml") - root = Element("node", {"order":"4", "type":"filter"}) + root = etree.Element("node", {"order":"4", "type":"filter"}) label = tagname + " - " + language(30178) - SubElement(root, "label").text = label - SubElement(root, "match").text = "all" - SubElement(root, "content").text = "episodes" - SubElement(root, "icon").text = "special://home/addons/plugin.video.emby/icon.png" - Rule = SubElement(root, "rule", {"field":"tag","operator":"is"}) - SubElement(Rule, "value").text = tagname + etree.SubElement(root, "label").text = label + etree.SubElement(root, "match").text = "all" + etree.SubElement(root, "content").text = "episodes" + etree.SubElement(root, "icon").text = "special://home/addons/plugin.video.emby/icon.png" + Rule = etree.SubElement(root, "rule", {"field":"tag","operator":"is"}) + etree.SubElement(Rule, "value").text = tagname #set limit to 25 --> currently hardcoded --> TODO: add a setting for this ? - SubElement(root, "limit").text = "25" - Rule2 = SubElement(root, "rule", {"field":"inprogress","operator":"true"}) + etree.SubElement(root, "limit").text = "25" + Rule2 = etree.SubElement(root, "rule", {"field":"inprogress","operator":"true"}) WINDOW.setProperty("Emby.nodes.%s.inprogressepisodes.title" %str(windowPropId),label) path = "library://video/Emby - %s/%s_progress_episodes.xml"%(tagname,tagname) WINDOW.setProperty("Emby.nodes.%s.inprogressepisodes.path" %str(windowPropId),"ActivateWindow(Video,%s,return)"%path) WINDOW.setProperty("Emby.nodes.%s.inprogressepisodes.content" %str(windowPropId),path) try: - ET.ElementTree(root).write(nodefile, xml_declaration=True) + etree.ElementTree(root).write(nodefile, xml_declaration=True) except: - ET.ElementTree(root).write(nodefile) + etree.ElementTree(root).write(nodefile) #create tag node - nextup items nodefile = os.path.join(libraryPath, tagname + "_nextup_episodes.xml") - root = Element("node", {"order":"4", "type":"folder"}) + root = etree.Element("node", {"order":"4", "type":"folder"}) label = tagname + " - " + language(30179) - SubElement(root, "label").text = label - SubElement(root, "content").text = "episodes" + etree.SubElement(root, "label").text = label + etree.SubElement(root, "content").text = "episodes" path = "plugin://plugin.video.emby/?id=%s&mode=nextup&limit=25" %tagname - SubElement(root, "path").text = path - SubElement(root, "icon").text = "special://home/addons/plugin.video.emby/icon.png" + etree.SubElement(root, "path").text = path + etree.SubElement(root, "icon").text = "special://home/addons/plugin.video.emby/icon.png" WINDOW.setProperty("Emby.nodes.%s.nextepisodes.title" %str(windowPropId),label) path = "library://video/Emby - %s/%s_nextup_episodes.xml"%(tagname,tagname) WINDOW.setProperty("Emby.nodes.%s.nextepisodes.path" %str(windowPropId),"ActivateWindow(Video,%s,return)"%path) WINDOW.setProperty("Emby.nodes.%s.nextepisodes.content" %str(windowPropId),path) try: - ET.ElementTree(root).write(nodefile, xml_declaration=True) + etree.ElementTree(root).write(nodefile, xml_declaration=True) except: - ET.ElementTree(root).write(nodefile) + etree.ElementTree(root).write(nodefile) def buildVideoNodesListing(self): @@ -256,12 +250,12 @@ class VideoNodes(): #create tag node for emby channels nodefile = os.path.join(xbmc.translatePath("special://profile/library/video"), "emby_channels.xml") - root = Element("node", {"order":"1", "type":"folder"}) + root = etree.Element("node", {"order":"1", "type":"folder"}) label = "Emby - " + language(30173) - SubElement(root, "label").text = label - SubElement(root, "content").text = "movies" - SubElement(root, "path").text = "plugin://plugin.video.emby/?id=0&mode=channels" - SubElement(root, "icon").text = "special://home/addons/plugin.video.emby/icon.png" + etree.SubElement(root, "label").text = label + etree.SubElement(root, "content").text = "movies" + etree.SubElement(root, "path").text = "plugin://plugin.video.emby/?id=0&mode=channels" + etree.SubElement(root, "icon").text = "special://home/addons/plugin.video.emby/icon.png" WINDOW.setProperty("Emby.nodes.%s.title" %str(totalNodesCount),label) WINDOW.setProperty("Emby.nodes.%s.type" %str(totalNodesCount),"channels") path = "library://video/emby_channels.xml" @@ -269,21 +263,21 @@ class VideoNodes(): WINDOW.setProperty("Emby.nodes.%s.content" %str(totalNodesCount),path) totalNodesCount +=1 try: - ET.ElementTree(root).write(nodefile, xml_declaration=True) + etree.ElementTree(root).write(nodefile, xml_declaration=True) except: - ET.ElementTree(root).write(nodefile) + etree.ElementTree(root).write(nodefile) #create tag node - favorite shows nodefile = os.path.join(xbmc.translatePath("special://profile/library/video"),"emby_favorite_shows.xml") - root = Element("node", {"order":"1", "type":"filter"}) + root = etree.Element("node", {"order":"1", "type":"filter"}) label = "Emby - " + language(30181) - SubElement(root, "label").text = label - SubElement(root, "match").text = "all" - SubElement(root, "content").text = "tvshows" - SubElement(root, "icon").text = "special://home/addons/plugin.video.emby/icon.png" - SubElement(root, "order", {"direction":"ascending"}).text = "sorttitle" - Rule = SubElement(root, "rule", {"field":"tag","operator":"is"}) - SubElement(Rule, "value").text = "Favorite tvshows" #do not localize the tagname itself + etree.SubElement(root, "label").text = label + etree.SubElement(root, "match").text = "all" + etree.SubElement(root, "content").text = "tvshows" + etree.SubElement(root, "icon").text = "special://home/addons/plugin.video.emby/icon.png" + etree.SubElement(root, "order", {"direction":"ascending"}).text = "sorttitle" + Rule = etree.SubElement(root, "rule", {"field":"tag","operator":"is"}) + etree.SubElement(Rule, "value").text = "Favorite tvshows" #do not localize the tagname itself WINDOW.setProperty("Emby.nodes.%s.title" %str(totalNodesCount),label) WINDOW.setProperty("Emby.nodes.%s.type" %str(totalNodesCount),"favourites") path = "library://video/emby_favorite_shows.xml" @@ -291,21 +285,21 @@ class VideoNodes(): WINDOW.setProperty("Emby.nodes.%s.content" %str(totalNodesCount),path) totalNodesCount +=1 try: - ET.ElementTree(root).write(nodefile, xml_declaration=True) + etree.ElementTree(root).write(nodefile, xml_declaration=True) except: - ET.ElementTree(root).write(nodefile) + etree.ElementTree(root).write(nodefile) #create tag node - favorite movies nodefile = os.path.join(xbmc.translatePath("special://profile/library/video"),"emby_favorite_movies.xml") - root = Element("node", {"order":"1", "type":"filter"}) + root = etree.Element("node", {"order":"1", "type":"filter"}) label = "Emby - " + language(30180) - SubElement(root, "label").text = label - SubElement(root, "match").text = "all" - SubElement(root, "content").text = "movies" - SubElement(root, "icon").text = "special://home/addons/plugin.video.emby/icon.png" - SubElement(root, "order", {"direction":"ascending"}).text = "sorttitle" - Rule = SubElement(root, "rule", {"field":"tag","operator":"is"}) - SubElement(Rule, "value").text = "Favorite movies" #do not localize the tagname itself + etree.SubElement(root, "label").text = label + etree.SubElement(root, "match").text = "all" + etree.SubElement(root, "content").text = "movies" + etree.SubElement(root, "icon").text = "special://home/addons/plugin.video.emby/icon.png" + etree.SubElement(root, "order", {"direction":"ascending"}).text = "sorttitle" + Rule = etree.SubElement(root, "rule", {"field":"tag","operator":"is"}) + etree.SubElement(Rule, "value").text = "Favorite movies" #do not localize the tagname itself WINDOW.setProperty("Emby.nodes.%s.title" %str(totalNodesCount),label) WINDOW.setProperty("Emby.nodes.%s.type" %str(totalNodesCount),"favourites") path = "library://video/emby_favorite_movies.xml" @@ -313,13 +307,13 @@ class VideoNodes(): WINDOW.setProperty("Emby.nodes.%s.content" %str(totalNodesCount),path) totalNodesCount +=1 try: - ET.ElementTree(root).write(nodefile, xml_declaration=True) + etree.ElementTree(root).write(nodefile, xml_declaration=True) except: - ET.ElementTree(root).write(nodefile) + etree.ElementTree(root).write(nodefile) WINDOW.setProperty("Emby.nodes.total", str(totalNodesCount)) + except Exception as e: utils.logMsg("Emby addon","Error while creating videonodes listings, restart required ?") - print e - \ No newline at end of file + print e \ No newline at end of file diff --git a/service.py b/service.py index 966c0e5b..7616dbf0 100644 --- a/service.py +++ b/service.py @@ -45,6 +45,17 @@ class Service(): self.logMsg("KODI Version: %s" % xbmc.getInfoLabel("System.BuildVersion"), 0) self.logMsg("%s Version: %s" % (addonName, self.clientInfo.getVersion()), 0) self.logMsg("Platform: %s" % (self.clientInfo.getPlatform()), 0) + + #reset all window props on startup for user profile switches + self.WINDOW.clearProperty("startup") + embyProperty = self.WINDOW.getProperty("Emby.nodes.total") + propNames = ["index","path","title","content","inprogress.content","inprogress.title","inprogress.content","inprogress.path","nextepisodes.title","nextepisodes.content","nextepisodes.path","unwatched.title","unwatched.content","unwatched.path","recent.title","recent.content","recent.path","recentepisodes.title","recentepisodes.content","recentepisodes.path","inprogressepisodes.title","inprogressepisodes.content","inprogressepisodes.path"] + if embyProperty: + totalNodes = int(embyProperty) + for i in range(totalNodes): + for prop in propNames: + self.WINDOW.clearProperty("Emby.nodes.%s.%s" %(str(i),prop)) + def logMsg(self, msg, lvl=1):