home *** CD-ROM | disk | FTP | other *** search
/ Maximum CD 2010 November / maximum-cd-2010-11.iso / DiscContents / xbmc-9.11.exe / scripts / AppleMovieTrailers / resources / lib / update.py < prev    next >
Encoding:
Python Source  |  2008-09-14  |  5.8 KB  |  145 lines

  1. """
  2. Update module
  3.  
  4. Nuka1195
  5. """
  6.  
  7. import sys
  8. import os
  9. import xbmcgui
  10. import urllib
  11. import socket
  12. from sgmllib import SGMLParser
  13.  
  14. socket.setdefaulttimeout( 10 )
  15.  
  16. _ = sys.modules[ "__main__" ].__language__
  17. __scriptname__ = sys.modules[ "__main__" ].__scriptname__
  18. __version__ = sys.modules[ "__main__" ].__version__
  19. __svn_revision__ = sys.modules[ "__main__" ].__svn_revision__
  20.  
  21.  
  22. class Parser( SGMLParser ):
  23.     """ Parser Class: grabs all tag versions and urls """
  24.     def reset( self ):
  25.         self.tags = []
  26.         self.url = None
  27.         self.tag_found = None
  28.         self.url_found = True
  29.         SGMLParser.reset( self )
  30.  
  31.     def start_a( self, attrs ):
  32.         for key, value in attrs:
  33.             if ( key == "href" ): self.tag_found = value
  34.     
  35.     def handle_data( self, text ):
  36.         if ( self.tag_found == text.replace( " ", "%20" ) ):
  37.             self.tags.append( self.tag_found )
  38.             self.tag_found = False
  39.         if ( self.url_found ):
  40.             self.url = text.replace( " ", "%20" )
  41.             self.url_found = False
  42.             
  43.     def unknown_starttag( self, tag, attrs ):
  44.         if ( tag == "h2" ):
  45.             self.url_found = True
  46.  
  47.  
  48. class Update:
  49.     """ Update Class: used to update scripts from http://code.google.com/p/xbmc-scripting/ """
  50.     def __init__( self ):
  51.         self.base_url = "http://xbmc-scripting.googlecode.com/svn"
  52.         self.dialog = xbmcgui.DialogProgress()
  53.         new = self._check_for_new_version()
  54.         if ( new ): self._update_script()
  55.         else: xbmcgui.Dialog().ok( __scriptname__, _( 1000 + ( 30 * ( new is None ) ) ) )
  56.             
  57.     def _check_for_new_version( self ):
  58.         """ checks for a newer version """
  59.         self.dialog.create( __scriptname__, _( 1001 ) )
  60.         # get version tags
  61.         new = None
  62.         htmlsource = self._get_html_source( "%s/tags/%s" % ( self.base_url, __scriptname__.replace( " ", "%20" ), ) )
  63.         if ( htmlsource ):
  64.             self.versions, url = self._parse_html_source( htmlsource )
  65.             self.url = url[url.find( ":%20" ) + 4:]
  66.             if ( self.versions ):
  67.                 new = ( __version__ < self.versions[ -1 ][ : -1 ] or ( __version__.startswith( "pre-" ) and __version__.replace( "pre-", "" ) <= self.versions[ -1 ][ : -1 ] ) )
  68.         self.dialog.close()
  69.         return new
  70.                 
  71.     def _update_script( self ):
  72.         """ main update function """
  73.         try:
  74.             if ( xbmcgui.Dialog().yesno( __scriptname__, "%s %s %s." % ( _( 1006 ), self.versions[ -1 ][ : -1 ], _( 1002 ), ), _( 1003 ), "", _( 251 ), _( 252 ) ) ):
  75.                 self.dialog.create( __scriptname__, _( 1004 ), _( 1005 ) )
  76.                 script_files = []
  77.                 folders = ["%s/%s" % ( self.url, self.versions[-1], )]
  78.                 while folders:
  79.                     try:
  80.                         htmlsource = self._get_html_source( "%s%s" % ( self.base_url, folders[0] ) )
  81.                         if ( htmlsource ):
  82.                             items, url = self._parse_html_source( htmlsource )
  83.                             files, dirs = self._parse_items( items )
  84.                             url = url[ url.find( ":%20" ) + 4 : ]
  85.                             for file in files:
  86.                                 script_files.append( "%s/%s" % ( url, file, ) )
  87.                             for folder in dirs:
  88.                                 folders.append( "%s/%s" % ( folders[ 0 ], folder, ) )
  89.                         else: 
  90.                             raise
  91.                         folders = folders[ 1 : ]
  92.                     except:
  93.                         folders = None
  94.                 self._get_files( script_files, self.versions[ -1 ][ : -1 ] )
  95.         except:
  96.             self.dialog.close()
  97.             xbmcgui.Dialog().ok( __scriptname__, _( 1031 ) )
  98.         
  99.     def _get_files( self, script_files, version ):
  100.         """ fetch the files """
  101.         try:
  102.             for cnt, url in enumerate( script_files ):
  103.                 items = os.path.split( url )
  104.                 path = items[ 0 ].replace( "/tags/%s/" % ( __scriptname__.replace( " ", "%20" ), ), "Q:/scripts/%s_v" % ( __scriptname__, ) ).replace( "%20", " " )
  105.                 file = items[ 1 ].replace( "%20", " " )
  106.                 pct = int( ( float( cnt ) / len( script_files ) ) * 100 )
  107.                 self.dialog.update( pct, "%s %s" % ( _( 1007 ), url, ), "%s %s" % ( _( 1008 ), path, ), "%s %s" % ( _( 1009 ), file, ) )
  108.                 if ( self.dialog.iscanceled() ): raise
  109.                 if ( not os.path.isdir( path ) ): os.makedirs( path )
  110.                 urllib.urlretrieve( "%s%s" % ( self.base_url, url, ), os.path.join( path, file ) )
  111.         except:
  112.             raise
  113.         else:
  114.             self.dialog.close()
  115.             xbmcgui.Dialog().ok( __scriptname__, _( 1010 ), "Q:/scripts/%s_v%s/" % ( __scriptname__, version, ) )
  116.             
  117.     def _get_html_source( self, url ):
  118.         """ fetch the SVN html source """
  119.         try:
  120.             sock = urllib.urlopen( url )
  121.             htmlsource = sock.read()
  122.             sock.close()
  123.             return htmlsource
  124.         except: return None
  125.  
  126.     def _parse_html_source( self, htmlsource ):
  127.         """ parse html source for tagged version and url """
  128.         try:
  129.             parser = Parser()
  130.             parser.feed( htmlsource )
  131.             parser.close()
  132.             return parser.tags, parser.url
  133.         except: return None, None
  134.             
  135.     def _parse_items( self, items ):
  136.         """ separates files and folders """
  137.         folders = []
  138.         files = []
  139.         for item in items:
  140.             if ( item.endswith( "/" ) ):
  141.                 folders.append( item )
  142.             else:
  143.                 files.append( item )
  144.         return files, folders
  145.