home *** CD-ROM | disk | FTP | other *** search
/ Maximum CD 2010 November / maximum-cd-2010-11.iso / DiscContents / xbmc-9.11.exe / plugins / Programs / SVN Repo Installer / installerAPI / xbmcplugin_lib.py < prev    next >
Encoding:
Python Source  |  2009-11-03  |  6.9 KB  |  202 lines

  1. """
  2.  Common functions
  3. """
  4.  
  5. import os,sys,re
  6. import xbmc
  7. from urllib import unquote_plus, urlopen
  8.  
  9. __plugin__ = sys.modules["__main__"].__plugin__
  10. __date__ = '24-06-2009'
  11.  
  12. #################################################################################################################
  13. def log(msg):
  14.     xbmc.log("[%s]: %s" % (__plugin__, msg), xbmc.LOGDEBUG)
  15.  
  16. log("Module: %s Dated: %s loaded!" % (__name__, __date__))
  17.  
  18. #################################################################################################################
  19. def logError():
  20.     log("ERROR: %s (%d) - %s" % (sys.exc_info()[ 2 ].tb_frame.f_code.co_name, sys.exc_info()[ 2 ].tb_lineno, sys.exc_info()[ 1 ], ) )
  21.     
  22. #################################################################################################################
  23. def handleException(msg=""):
  24.     import traceback
  25.     import xbmcgui
  26.     traceback.print_exc()
  27.     xbmcgui.Dialog().ok(__plugin__ + " ERROR!", msg, str(sys.exc_info()[ 1 ]))
  28.  
  29. #################################################################################################################
  30. class Info:
  31.     def __init__( self, *args, **kwargs ):
  32.         self.__dict__.update( kwargs )
  33.         log( "Info() dict=%s" % self.__dict__ )
  34.     def has_key(self, key):
  35.         return self.__dict__.has_key(key)
  36.  
  37. #################################################################################################################
  38. def loadFileObj( filename ):
  39.     log( "loadFileObj() " + filename)
  40.     try:
  41.         file_handle = open( filename, "r" )
  42.         loadObj = eval( file_handle.read() )
  43.         file_handle.close()
  44.     except Exception, e:
  45.         log( "loadFileObj() " + str(e) )
  46.         loadObj = None
  47.     return loadObj
  48.  
  49. #################################################################################################################
  50. def saveFileObj( filename, saveObj ):
  51.     log( "saveFileObj() " + filename)
  52.     try:
  53.         file_handle = open( filename, "w" )
  54.         file_handle.write( repr( saveObj ) )
  55.         file_handle.close()
  56.         return True
  57.     except Exception, e:
  58.         log( "save_file_obj() " + str(e) )
  59.         return False
  60.  
  61. #################################################################################################################
  62. def readURL( url ):
  63.     log("readURL() url=" + url)
  64.     if not url:
  65.         return ""
  66.     try:
  67.         sock = urlopen( url )
  68.         doc = sock.read()
  69.         sock.close()
  70.         if ( "404 Not Found" in doc ):
  71.             log("readURL() 404, Not found")
  72.             doc = ""
  73.         return doc
  74.     except:
  75.         log("readURL() %s" % sys.exc_info()[ 1 ])
  76.         return None
  77.  
  78. #################################################################################################################
  79. def deleteFile( fn ):
  80.     try:
  81.         os.remove( fn )
  82.         log("deleteFile() deleted: " + fn)
  83.     except: pass
  84.  
  85. #####################################################################################################
  86. def get_repo_info( repo ):
  87.     # path to info file
  88.     repopath = os.path.join( os.getcwd(), "resources", "repositories", repo, "repo.xml" )
  89.     try:
  90.         info = open( repopath, "r" ).read()
  91.         # repo's base url
  92.         REPO_URL = re.findall( '<url>([^<]+)</url>', info )[ 0 ]
  93.         # root of repository
  94.         REPO_ROOT = re.findall( '<root>([^<]*)</root>', info )[ 0 ]
  95.         # structure of repo
  96.         REPO_STRUCTURES = re.findall( '<structure name="([^"]+)" noffset="([^"]+)" install="([^"]*)" ioffset="([^"]+)" voffset="([^"]+)"', info )
  97.         log("get_repo_info() REPO_URL=%s REPO_ROOT=%s REPO_STRUCTURES=%s" % (REPO_URL, REPO_ROOT, REPO_STRUCTURES))
  98.         return ( REPO_URL, REPO_ROOT, REPO_STRUCTURES, )
  99.     except:
  100.         logError("get_repo_info()")
  101.         return None
  102.  
  103. #####################################################################################################
  104. def load_repos( ):
  105.     repo_list = []
  106.     repos = os.listdir( os.path.join( os.getcwd(), "resources", "repositories" ) )
  107.     for repo in repos:
  108.         if ("(tagged)" not in repo and repo != ".svn") and (os.path.isdir( os.path.join( os.getcwd(), "resources", "repositories", repo ) ) ):
  109.             repo_list.append( repo )
  110.     log("load_repos() %s" % repo_list)
  111.     return repo_list
  112.  
  113. #####################################################################################################
  114. def check_readme( base_url ):
  115.     # try to get readme from: language, resources, root
  116.     urlList = ( "/".join( [base_url, "resources", "language", xbmc.getLanguage(), "readme.txt"] ),
  117.                 "/".join( [base_url, "resources", "readme.txt" ] ),
  118.                 "/".join( [base_url, "readme.txt" ] ) )
  119.  
  120.     for url in urlList:
  121.         url = url.replace(' ','%20')
  122.         doc = readURL( url )
  123.         if doc == None:
  124.             break
  125.         elif doc:
  126.             return url
  127.     return ""
  128.  
  129. #################################################################################################################
  130. def get_xbmc_revision():
  131.     try:
  132.         rev = int(re.search("r([0-9]+)",  xbmc.getInfoLabel( "System.BuildVersion" ), re.IGNORECASE).group(1))
  133.     except:
  134.         rev = 0
  135.     log("get_xbmc_revision() %d" % rev)
  136.     return rev
  137.  
  138. #####################################################################################################
  139. def parseDocTag(doc, tag):
  140.     try:
  141.         match = re.search("__%s__.*?[\"'](.*?)[\"']" % tag,  doc, re.IGNORECASE).group(1)
  142.         match = match.replace( "$", "" ).replace( "Revision", "" ).replace( "Date", "" ).replace( ":", "" ).strip()
  143.     except:
  144.         match = ""
  145.     log("parseDocTag() %s=%s" % (tag, match))
  146.     return match
  147.  
  148. #####################################################################################################
  149. def parseAllDocTags( doc ):
  150.     tagInfo = {}
  151.     # strings
  152.     for tag in ( "author", "version", "date", ):
  153.         tagInfo[tag] = parseDocTag( doc, tag )
  154.  
  155.     # title
  156.     title = parseDocTag( doc, "plugin" )
  157.     if not title:
  158.         title = parseDocTag( doc, "scriptname" )
  159.     tagInfo['title'] = title
  160.  
  161.     # ints
  162.     try:
  163.         value = int(parseDocTag( doc, "XBMC_Revision" ))
  164.     except:
  165.         value = 0
  166.     tagInfo["XBMC_Revision"] = value
  167.  
  168.     # svn_revision
  169.     try:
  170.         value = int(re.search("\$Revision: (\d+)", doc).group(1))
  171.     except:
  172.         value = 0
  173.     tagInfo["svn_revision"] = value
  174.  
  175.     log("parseAllDocTags() tagInfo=%s" % tagInfo)
  176.     return tagInfo
  177.  
  178. #####################################################################################################
  179. def makeLabel2( verState ):
  180.     if xbmc.getLocalizedString( 30014 ) in verState:                        # New
  181.         label2 = "[COLOR=FF00FFFF]%s[/COLOR]" % verState
  182.     elif xbmc.getLocalizedString( 30015 ) in verState:                        # Incompatible
  183.         label2 = "[COLOR=FFFF0000]%s[/COLOR]" % verState
  184.     elif verState == xbmc.getLocalizedString( 30011 ):                        # OK
  185.         label2 = "[COLOR=FF00FF00]%s[/COLOR]" % verState
  186.     elif verState == xbmc.getLocalizedString( 30018 ):                        # Deleted
  187.         label2 = "[COLOR=66FFFFFF]%s[/COLOR]" % verStat
  188.     else:
  189.         label2 = "[COLOR=FFFFFF00]%s[/COLOR]" % verState
  190.     return label2
  191.  
  192. #####################################################################################################
  193. def parseCategory(filepath):
  194.     try:
  195.         cat = re.search("(plugins.*|scripts.*)$",  filepath, re.IGNORECASE).group(1)
  196.         cat = cat.replace("\\", "/")
  197.     except:
  198.         cat = ""
  199.     log("parseCategory() cat=%s" % cat)
  200.     return cat
  201.  
  202.