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_info.py < prev    next >
Encoding:
Python Source  |  2009-11-03  |  6.4 KB  |  190 lines

  1. import os, sys
  2. import xbmc, xbmcgui
  3. import urllib
  4. from pprint import pprint
  5. from xbmcplugin_lib import *
  6. from shutil import rmtree, copytree
  7.  
  8. __plugin__ = sys.modules["__main__"].__plugin__
  9. __date__ = '23-06-2009'
  10. log("Module: %s Dated: %s loaded!" % (__name__, __date__))
  11.  
  12. #################################################################################################################
  13. class InfoDialog( xbmcgui.WindowXMLDialog ):
  14.     """ Show skinned Dialog with our information """
  15.  
  16.     XML_FILENAME = "script-svnri-iteminfo.xml"
  17.     EXIT_CODES = (9, 10, 216, 257, 275, 216, 61506, 61467,)
  18.  
  19.     def __init__( self, *args, **kwargs):
  20.         log( "%s init!" % self.__class__ )
  21.         self.action = None
  22.         self.buttons = {}
  23.  
  24.     def onInit( self ):
  25.         xbmcgui.lock()
  26.  
  27.         thumb = xbmc.translatePath(self.info.get('thumb', ''))
  28.         if thumb:
  29.             self.getControl( 31 ).setImage( thumb )
  30.  
  31.         self.getControl( 4 ).setLabel("[B]"+self.info.get('title','?')+"[/B]")
  32.         self.getControl( 6 ).setLabel(self.info.get('author','?'))
  33.         version = self.info.get('version','?')
  34.         if not version: version = '?'
  35.         svn_ver = self.info.get('svn_ver','?')
  36.         if not svn_ver: svn_ver = '?'
  37.         verText = "v%s -> v%s" % (version,svn_ver)
  38.         self.getControl( 8 ).setLabel(verText)
  39.         self.getControl( 10 ).setLabel(self.info.get('date','?'))
  40.         self.getControl( 12 ).setLabel(self.info.get('category','?'))
  41.         self.getControl( 19 ).setLabel(self.info.get('compatibility',''))
  42.         if self.info.get('changelog',''):
  43.             self.showChangelog()
  44.         elif self.info.get('readme',''):
  45.             self.showReadme()
  46.  
  47.         # set btns enabled state
  48.         btnIDs = {'install': 20,'uninstall': 21,'readme': 22,'changelog': 23 }
  49.         for btnName, isEnabled in self.buttons.items():
  50.             id = btnIDs[btnName]
  51.             self.getControl( id ).setEnabled( isEnabled )
  52.  
  53.         xbmcgui.unlock()
  54.  
  55.     def showChangelog(self):
  56.         self.getControl( 30 ).setText(self.info.get('changelog',''))
  57.     def showReadme(self):
  58.         self.getControl( 30 ).setText(self.info.get('readme',''))
  59.  
  60.     def onClick( self, controlId ):
  61.         if controlId in (20,21,22,23,24):
  62.             if controlId == 22:
  63.                 self.showReadme()
  64.             elif controlId == 23:
  65.                 self.showChangelog()
  66.             elif controlId == 20:
  67.                 self.action = "install"
  68.             elif controlId == 21:
  69.                 self.action = "uninstall"
  70.             else:
  71.                 self.action = None
  72.  
  73.             if controlId not in (22,23):
  74.                 self.close()
  75.  
  76.     def onFocus( self, controlId ):
  77.         pass
  78.  
  79.     def onAction( self, action ):
  80.         try:
  81.             buttonCode =  action.getButtonCode()
  82.             actionID   =  action.getId()
  83.         except: return
  84.         if actionID in self.EXIT_CODES or buttonCode in self.EXIT_CODES:
  85.             self.close()
  86.  
  87.     def ask(self, info, buttons ):
  88. #        pprint (info)
  89.         if info:
  90.             self.info = info
  91.             self.buttons = buttons
  92.             self.doModal()
  93.         log("ask() action=%s" % self.action)
  94.         return self.action
  95.  
  96. ########################################################################################################################
  97. class Main:
  98.  
  99.     INSTALLED_ITEMS_FILENAME = os.path.join( os.getcwd(), "installed_items.dat" )
  100.  
  101.     def __init__( self, *args, **kwargs):
  102.         log( "%s started!" % self.__class__ )
  103.         try:
  104.             self._parse_argv()
  105.             if self.args.has_key("show_info"):
  106.                 info = self._load_item()
  107.                 if info:
  108.                     self.show_info( info )
  109.         except Exception, e:
  110.             xbmcgui.Dialog().ok(__plugin__ + " ERROR!", str(e))
  111.  
  112.     ########################################################################################################################
  113.     def _parse_argv(self):
  114.         # call Info() with our formatted argv to create the self.args object
  115.         exec "self.args = Info(%s)" % ( unquote_plus( sys.argv[ 2 ][ 1 : ].replace( "&", ", " ) ), )
  116.  
  117.     ########################################################################################################################
  118.     def _load_item( self ):
  119.         info = {}
  120.         items = loadFileObj(self.INSTALLED_ITEMS_FILENAME)
  121.         filepath = self.args.show_info
  122.         log("looking for filepath=%s" % filepath)
  123.         # find addon from installed list
  124.         for i, item in enumerate(items):
  125.             if item.get('filepath','') == filepath:
  126.                 info = item
  127.                 break
  128.         log("_load_item() info=%s" % info)
  129.         return info
  130.  
  131.     ########################################################################################################################
  132.     def show_info( self, info ):
  133.         log("> show_info() ")
  134.         pprint (info)
  135.         quit = False
  136.         buttons = {'install': True,'uninstall': True, 'readme': True, 'changelog': True }
  137.  
  138.         # fetch changelog
  139.         dialog = xbmcgui.DialogProgress()
  140.         dialog.create( __plugin__, xbmc.getLocalizedString( 30001 ),  xbmc.getLocalizedString( 30017 ))
  141.         from xbmcplugin_logviewer import ChangelogParser
  142.         parser = ChangelogParser( info['repo'] , info['title']  )
  143.         info['changelog'] = parser.fetch_changelog()
  144.  
  145.         # fetch readme
  146.         readme_url = info.get('readme','')
  147.         if readme_url.startswith('http'):
  148.             dialog.update( 50, xbmc.getLocalizedString( 30001 ),  os.path.basename(readme_url))
  149.             info['readme'] = readURL(readme_url)
  150.         dialog.close()
  151.         if not readme_url or not info.get('readme',''):
  152.             buttons['readme'] = False
  153.  
  154.         # setup compatibility text
  155.         svn_xbmc_rev = info.get('XBMC_Revision',0)
  156.         info['compatibility'] = "XBMC: %s - " % xbmc.getInfoLabel( "System.BuildVersion" )
  157.         if svn_xbmc_rev and svn_xbmc_rev > get_xbmc_revision():
  158.             info['compatibility'] += "[COLOR=FFFF0000]%s[/COLOR] - Requires XBMC: r%s" % (xbmc.getLocalizedString( 30015 ), svn_xbmc_rev) # incomp
  159.         else:
  160.             info['compatibility'] += "[COLOR=FF00FF00]%s[/COLOR]" % (xbmc.getLocalizedString( 30704 ))        # ok, comp
  161.  
  162.         # set INSTALL button
  163.         if not info.get('download_url',''):
  164.             buttons['install'] = False
  165.  
  166.         # set UNINSTALL button
  167.         if not os.path.exists(info.get('filepath','')) or "SVN Repo Installer" in info['title']:
  168.             buttons['uninstall'] = False
  169.  
  170.         while info:
  171.             action = InfoDialog( InfoDialog.XML_FILENAME, os.getcwd(), "Default" ).ask( info, buttons )
  172.             if not action:
  173.                 break
  174.             elif action == "install":
  175.                 # install
  176.                 url_args = info['download_url']
  177.                 if "SVN Repo Installer" in info['title']:
  178.                     url_args = "self_update=True&" + url_args
  179.                 path = '%s?%s' % ( sys.argv[ 0 ], url_args, )
  180.                 command = 'XBMC.RunPlugin(%s)' % path
  181.                 xbmc.executebuiltin(command)
  182.                 break
  183.             elif action == "uninstall":
  184.                 path = '%s?delete=%s&title=%s' % ( sys.argv[ 0 ], urllib.quote_plus( repr(info['filepath']) ), urllib.quote_plus( repr(info['title']) ),)
  185.                 command = 'XBMC.RunPlugin(%s)' % path
  186.                 xbmc.executebuiltin(command)
  187.                 break
  188.  
  189.         log("< show_info()")
  190.