home *** CD-ROM | disk | FTP | other *** search
/ Maximum CD 2010 May / maximum-cd-2010-05.iso / DiscContents / boxee-0.9.20.10711.exe / scripts / Lyrics / resources / lib / utilities.py < prev   
Encoding:
Python Source  |  2009-07-20  |  6.6 KB  |  174 lines

  1. """
  2. Catchall module for shared functions and constants
  3.  
  4. Nuka1195
  5. """
  6.  
  7. import sys
  8. import os
  9. import xbmc
  10. import xbmcgui
  11.  
  12. DEBUG_MODE = 0
  13.  
  14. _ = sys.modules[ "__main__" ].__language__
  15. __scriptname__ = sys.modules[ "__main__" ].__scriptname__
  16. __version__ = sys.modules[ "__main__" ].__version__
  17. __svn_revision__ = sys.modules[ "__main__" ].__svn_revision__
  18.  
  19. # comapatble versions
  20. SETTINGS_VERSIONS = ( "1.6.0", )
  21. # base paths
  22. BASE_DATA_PATH = xbmc.translatePath( os.path.join( "P:\\script_data", os.path.basename( os.getcwd() ) ) )
  23. BASE_SETTINGS_PATH = xbmc.translatePath( os.path.join( "P:\\script_data", os.path.basename( os.getcwd() ), "settings.txt" ) )
  24. BASE_RESOURCE_PATH = sys.modules[ "__main__" ].BASE_RESOURCE_PATH
  25. # special button codes
  26. SELECT_ITEM = ( 11, 256, 61453, )
  27. EXIT_SCRIPT = ( 247, 275, 61467, )
  28. CANCEL_DIALOG = EXIT_SCRIPT + ( 216, 257, 61448, )
  29. GET_EXCEPTION = ( 216, 260, 61448, )
  30. SETTINGS_MENU = ( 229, 259, 261, 61533, )
  31. SHOW_CREDITS = ( 195, 274, 61507, )
  32. MOVEMENT_UP = ( 166, 270, 61478, )
  33. MOVEMENT_DOWN = ( 167, 271, 61480, )
  34. # special action codes
  35. ACTION_SELECT_ITEM = ( 7, )
  36. ACTION_EXIT_SCRIPT = ( 10, )
  37. ACTION_CANCEL_DIALOG = ACTION_EXIT_SCRIPT + ( 9, )
  38. ACTION_GET_EXCEPTION = ( 0, 11 )
  39. ACTION_SETTINGS_MENU = ( 117, )
  40. ACTION_SHOW_CREDITS = ( 122, )
  41. ACTION_MOVEMENT_UP = ( 3, )
  42. ACTION_MOVEMENT_DOWN = ( 4, )
  43. # Log status codes
  44. LOG_INFO, LOG_ERROR, LOG_NOTICE, LOG_DEBUG = range( 1, 5 )
  45.  
  46. def _create_base_paths():
  47.     """ creates the base folders """
  48.     if ( not os.path.isdir( BASE_DATA_PATH ) ):
  49.         os.makedirs( BASE_DATA_PATH )
  50. _create_base_paths()
  51.  
  52. def get_keyboard( default="", heading="", hidden=False ):
  53.     """ shows a keyboard and returns a value """
  54.     keyboard = xbmc.Keyboard( default, heading, hidden )
  55.     keyboard.doModal()
  56.     if ( keyboard.isConfirmed() ):
  57.         return keyboard.getText()
  58.     return default
  59.  
  60. def get_numeric_dialog( default="", heading="", dlg_type=3 ):
  61.     """ shows a numeric dialog and returns a value
  62.         - 0 : ShowAndGetNumber        (default format: #)
  63.         - 1 : ShowAndGetDate            (default format: DD/MM/YYYY)
  64.         - 2 : ShowAndGetTime            (default format: HH:MM)
  65.         - 3 : ShowAndGetIPAddress    (default format: #.#.#.#)
  66.     """
  67.     dialog = xbmcgui.Dialog()
  68.     value = dialog.numeric( type, heading, default )
  69.     return value
  70.  
  71. def get_browse_dialog( default="", heading="", dlg_type=1, shares="files", mask="", use_thumbs=False, treat_as_folder=False ):
  72.     """ shows a browse dialog and returns a value
  73.         - 0 : ShowAndGetDirectory
  74.         - 1 : ShowAndGetFile
  75.         - 2 : ShowAndGetImage
  76.         - 3 : ShowAndGetWriteableDirectory
  77.     """
  78.     dialog = xbmcgui.Dialog()
  79.     value = dialog.browse( dlg_type, heading, shares, mask, use_thumbs, treat_as_folder, default )
  80.     return value
  81.  
  82. def LOG( status, format, *args ):
  83.     if ( DEBUG_MODE >= status ):
  84.         xbmc.output( "%s: %s\n" % ( ( "INFO", "ERROR", "NOTICE", "DEBUG", )[ status - 1 ], format % args, ) )
  85.  
  86. def show_credits():
  87.     """ shows a credit window """
  88.     import resources.lib.credits as credits
  89.     c = credits.GUI( "script-%s-credits.xml" % ( __scriptname__.replace( " ", "_" ), ), os.getcwd(), "Default" )
  90.     c.doModal()
  91.     del c
  92.  
  93. def make_legal_filepath( path, compatible=False, extension=True ):
  94.     environment = os.environ.get( "OS", "xbox" )
  95.     path = path.replace( "\\", "/" )
  96.     drive = os.path.splitdrive( path )[ 0 ]
  97.     parts = os.path.splitdrive( path )[ 1 ].split( "/" )
  98.     if ( not drive and parts[ 0 ].endswith( ":" ) and len( parts[ 0 ] ) == 2 and compatible ):
  99.         drive = parts[ 0 ]
  100.         parts[ 0 ] = ""
  101.     if ( environment == "xbox" or environment == "win32" or compatible ):
  102.         illegal_characters = """,*=|<>?;:"+"""
  103.         for count, part in enumerate( parts ):
  104.             tmp_name = ""
  105.             for char in part:
  106.                 if ( char in illegal_characters ): char = ""
  107.                 tmp_name += char
  108.             if ( environment == "xbox" or compatible ):
  109.                 if ( len( tmp_name ) > 42 ):
  110.                     if ( count == len( parts ) - 1 and extension == True ):
  111.                         ext = os.path.splitext( tmp_name )[ 1 ]
  112.                         tmp_name = "%s%s" % ( os.path.splitext( tmp_name )[ 0 ][ : 42 - len( ext ) ].strip(), ext, )
  113.                     else:
  114.                         tmp_name = tmp_name[ : 42 ].strip()
  115.             parts[ count ] = tmp_name
  116.     filepath = drive + "/".join( parts )
  117.     if ( environment == "win32" ):
  118.         return filepath.encode( "utf-8" )
  119.     else:
  120.         return filepath
  121.  
  122.  
  123. class Settings:
  124.     """ Settings class """
  125.     def get_settings( self, defaults=False ):
  126.         """ read settings """
  127.         try:
  128.             settings = {}
  129.             if ( defaults ): raise
  130.             settings_file = open( BASE_SETTINGS_PATH, "r" )
  131.             settings = eval( settings_file.read() )
  132.             settings_file.close()
  133.             if ( settings[ "version" ] not in SETTINGS_VERSIONS ):
  134.                 raise
  135.         except:
  136.             settings = self._use_defaults( settings, save=( defaults == False ) )
  137.         return settings
  138.  
  139.     def _use_defaults( self, current_settings=None, save=True ):
  140.         """ setup default values if none obtained """
  141.         LOG( LOG_NOTICE, "%s (ver: %s) used default settings", __scriptname__, __version__ )
  142.         settings = {}
  143.         defaults = {  
  144.             "scraper": "lyricwiki",
  145.             "save_lyrics": True,
  146.             "lyrics_path": os.path.join( BASE_DATA_PATH, "lyrics" ),
  147.             "smooth_scrolling": False,
  148.             "show_viz": True,
  149.             "use_filename": False,
  150.             "filename_format": 0,
  151.             "music_path": "",
  152.             "shuffle": True,
  153.             "compatible": False,
  154.             "use_extension": True,
  155.             }
  156.         for key, value in defaults.items():
  157.             # add default values for missing settings
  158.             settings[ key ] = current_settings.get( key, defaults[ key ] )
  159.         settings[ "version" ] = __version__
  160.         if ( save ):
  161.             ok = self.save_settings( settings )
  162.         return settings
  163.  
  164.     def save_settings( self, settings ):
  165.         """ save settings """
  166.         try:
  167.             settings_file = open( BASE_SETTINGS_PATH, "w" )
  168.             settings_file.write( repr( settings ) )
  169.             settings_file.close()
  170.             return True
  171.         except:
  172.             LOG( LOG_ERROR, "%s (rev: %s) %s::%s (%d) [%s]", __scriptname__, __svn_revision__, self.__class__.__name__, sys.exc_info()[ 2 ].tb_frame.f_code.co_name, sys.exc_info()[ 2 ].tb_lineno, sys.exc_info()[ 1 ], )
  173.             return False
  174.