""" SVN Repo Installer - Actions """ import sys, os import os.path import re import xbmc, xbmcgui from xbmcplugin_lib import * from shutil import rmtree, copytree __plugin__ = sys.modules["__main__"].__plugin__ __date__ = '15-10-2009' log("Module: %s Dated: %s loaded!" % (__name__, __date__)) class Main: # INSTALLED_ITEMS_FILENAME = os.path.join( os.getcwd(), "installed_items.dat" ) INSTALLED_ITEMS_FILENAME = os.path.join( HOME_DIR, "installed_items.dat" ) def __init__( self ): log( "%s started!" % self.__class__ ) try: self._parse_argv() if ( self.args.has_key("delete") ): self.delete_update_item() # elif ( self.args.has_key("update") ): # self.update() elif ( self.args.has_key("self_update") ): self.self_update() except Exception, e: xbmcgui.Dialog().ok(__plugin__ + " ERROR!", str(e)) ######################################################################################################################## def _parse_argv(self): # call Info() with our formatted argv to create the self.args object exec "self.args = Info(%s)" % ( unquote_plus( sys.argv[ 2 ][ 1 : ].replace( "&", ", " ) ), ) ######################################################################################################################## def delete_update_item(self): log("delete_update_item()") if xbmcgui.Dialog().yesno(__plugin__, self.args.title,"", "", xbmc.getLocalizedString( 30020 ), xbmc.getLocalizedString( 30022 )): # Delete, Skip items = loadFileObj(self.INSTALLED_ITEMS_FILENAME) if items is None and self.args.has_key( "delete_from_list" ): items = {'filepath': self.args.delete} filepath = self.args.delete # find addon from installed list for i, item in enumerate(items): if item['filepath'] == filepath or self.args.has_key( "delete_from_list" ): log("addon details: %s" % item) # make backup - if not deleting a backup copy if ".backup" not in filepath: backupPath, category = self.makeBackup(filepath) removeList = False else: category = self.parseCategory(filepath) backupPath = filepath removeList = True if backupPath and category: # remove addon dir tree try: rmtree(filepath) log("dir deleted: " + filepath) # update list with new filepath, or remove from list if delting backup if removeList: del items[i] else: # update filepath to indicated Deleted items[i]['filepath'] = backupPath if not self.args.has_key( "delete_from_list" ): saveFileObj(self.INSTALLED_ITEMS_FILENAME, items) if not removeList: xbmcgui.Dialog().ok(__plugin__, xbmc.getLocalizedString( 30018 ), xbmc.getLocalizedString( 30004 ), category) else: xbmcgui.Dialog().ok(__plugin__, xbmc.getLocalizedString( 30018 ), category) # no backup # force list refresh xbmc.executebuiltin('Container.Refresh') except: handleException("delete_update_item()") break ##################################################################################################### def parseCategory(self, filepath): try: cat = re.search("(plugins.*|scripts.*)$", filepath, re.IGNORECASE).group(1) cat = cat.replace("\\", "/") except: cat = "" log("parseCategory() cat=%s" % cat) return cat ######################################################################################################################## def makeBackup( self, installedPath ): """ copy addon to /.backups """ log("> makeBackup() installedPath=%s" % installedPath) try: dialog = xbmcgui.DialogProgress() dialog.create( __plugin__, "Making Backup ..." ) category = "" if installedPath[-1] in ('\\','/'): installedPath = installedPath[:-1] # extract rootpath , addon name matches = re.search("(.*)[\\\/](.*?)$", installedPath) rootpath = matches.group(1) name = matches.group(2) log("rootpath=%s name=%s" % (rootpath, name)) # create root backup path backupPath = os.path.join(rootpath, ".backups") log("backupPath=%s" % backupPath) # make root backup dir try: os.makedirs(backupPath) log("created dir " + backupPath ) except: pass # remove any existing backup try: backupPath = os.path.join(backupPath, name) rmtree( backupPath, ignore_errors=True ) log("removed existing dir " + backupPath) except: pass # copy to backup path log("copytree %s -> %s" % (installedPath, backupPath)) copytree(installedPath, backupPath) log("copytree success") # extract category in .backups category = re.search("(plugins.*|scripts.*)$", backupPath).group(1) # check file exists in backup if not os.path.exists(os.path.join(backupPath, "default.py")): xbmcgui.Dialog().ok(__plugin__, "Make backup failed!", category) backupPath = "" except: handleException("makeBackup()") backupPath = "" dialog.close() log("< makeBackup() backupPath=%s category=%s" % (backupPath, category)) return (backupPath, category) ######################################################################################################################## def _parseCategoryPath(self): # extract category in .backups category = re.search("(plugins.*|scripts.*)$", backupPath).group(1) ######################################################################################################################## def self_update(self): log("> self_update()") # make backup filepath= xbmc.translatePath("special://home/plugins/programs/" + __plugin__) backupPath, category = self.makeBackup(filepath) # launch download from backup if backupPath and category: # remove self_update arg from downloader url url_args = sys.argv[2].replace("self_update=True&", "") # create path to module in backups filepath= "plugin://programs/.backups/" + __plugin__ path = '%s%s' % ( filepath, url_args, ) # run module from backup command = 'XBMC.RunPlugin(%s)' % path log(command) xbmc.executebuiltin(command) log("< self_update()") if ( __name__ == "__main__" ): Main()