diff --git a/resources/lib/backup.py b/resources/lib/backup.py index dce1270..7f65dc5 100644 --- a/resources/lib/backup.py +++ b/resources/lib/backup.py @@ -5,6 +5,7 @@ import utils as utils import time import json from vfs import XBMCFileSystem,DropboxFileSystem,ZipFileSystem +from resources.lib.guisettings import GuiSettingsManager def folderSort(aKey): result = aKey[0] @@ -423,6 +424,11 @@ class XbmcBackup: self.xbmc_vfs.rmfile(xbmc.translatePath("special://temp/" + self.restore_point)) self.xbmc_vfs.rmdir(self.remote_vfs.root_path) + if(utils.getSetting("backup_config") == "true"): + #update the guisettings information (or what we can from it) + gui_settings = GuiSettingsManager('special://home/userdata/guisettings.xml') + gui_settings.run() + #call update addons to refresh everything xbmc.executebuiltin('UpdateLocalAddons') diff --git a/resources/lib/guisettings.py b/resources/lib/guisettings.py new file mode 100644 index 0000000..de50b0e --- /dev/null +++ b/resources/lib/guisettings.py @@ -0,0 +1,96 @@ +import utils as utils +from xml.dom import minidom +from xml.parsers.expat import ExpatError +import json +import xbmc,xbmcvfs + + +class GuiSettingsManager: + doc = None + settings_allowed = list() + found_settings = list() + + def __init__(self,settingsFile): + self._readFile(xbmc.translatePath(settingsFile)) + + def run(self): + #get a list of all the settings we can manipulate via json + json_response = json.loads(xbmc.executeJSONRPC('{"jsonrpc":"2.0", "id":1, "method":"Settings.GetSettings","params":{"level":"advanced"}}')) + + settings = json_response['result']['settings'] + + for aSetting in settings: + self.settings_allowed.append(aSetting['id']) + + #parse the existing xml file and get all the settings + root_nodes = self.__parseNodes(self.doc.documentElement) + + for aNode in root_nodes: + secondary_list = self.__parseNodes(self.doc.getElementsByTagName(aNode.name)[0]) + + for secondNode in secondary_list: + #if the node does not have children and is not default + if(not secondNode.hasChildren and not secondNode.isDefault): + + if(secondNode.json_name() in self.settings_allowed): + self.found_settings.append(secondNode) + + #go through all the found settings and update them + for aSetting in self.found_settings: + utils.log("updating: " + aSetting.json_name() + ", value: " + aSetting.value) + + #check for boolean and numeric values + if(aSetting.value.isdigit() or (aSetting.value == 'true' or aSetting.value == 'false')): + xbmc.executeJSONRPC('{"jsonrpc":"2.0", "id":1, "method":"Settings.SetSettingValue","params":{"setting":"' + aSetting.json_name() + '","value":' + aSetting.value + '}}') + else: + xbmc.executeJSONRPC('{"jsonrpc":"2.0", "id":1, "method":"Settings.SetSettingValue","params":{"setting":"' + aSetting.json_name() + '","value":"' + aSetting.value + '"}}') + + def __parseNodes(self,nodeList): + result = [] + + for node in nodeList.childNodes: + if(node.nodeType == self.doc.ELEMENT_NODE): + aSetting = SettingNode(node.nodeName) + + #detect if there are any element nodes + if(len(node.childNodes) > 0): + for child_node in node.childNodes: + if(child_node.nodeType == self.doc.ELEMENT_NODE): + aSetting.hasChildren = True + + if(not aSetting.hasChildren and len(node.childNodes) > 0): + aSetting.value = node.firstChild.nodeValue + + if('default' not in node.attributes.keys()): + aSetting.isDefault = False + + aSetting.parent = node.parentNode.nodeName + + result.append(aSetting) + return result + + + def _readFile(self,fileLoc): + + if(xbmcvfs.exists(fileLoc)): + + try: + + self.doc = minidom.parse(fileLoc) + except ExpatError: + utils.log("Can't read " + fileLoc) + +class SettingNode: + name = '' + value = '' + hasChildren = False + isDefault = True + parent = '' + + def __init__(self,name): + self.name = name + + def json_name(self): + return self.parent + "." + self.name + + \ No newline at end of file