text: # encoding: UTF-8
  
  import json
  import os
  
  import logger
  from singleton import Singleton
  from const import Constant
  
  log = logger.getLogger(__name__)
  
  
  class Config(Singleton):
      def __init__(self):
          if hasattr(self, '_init'):
              return
          self._init = True
          self.config_file_path = Constant.config_path
          self.default_config = {
              'version': 6,
              'cache': {
                  'value': False,
                  'default': False,
                  'describe': ('A toggle to enable cache function or not. '
                               'Set value to true to enable it.')
              },
              'mpg123_parameters': {
                  'value': [],
                  'default': [],
                  'describe': 'The additional parameters when mpg123 start.'
              },
              'aria2c_parameters': {
                  'value': [],
                  'default': [],
                  'describe': ('The additional parameters when '
                               'aria2c start to download something.')
              },
              'music_quality': {
                  'value': 0,
                  'default': 0,
                  'describe': ('Select the quality of the music. '
                               'May be useful when network is terrible. '
                               '0 for high quality, 1 for medium and 2 for low.')
              },
              'global_play_pause': {
                  'value': '<ctrl><alt>p',
                  'default': '<ctrl><alt>p',
                  'describe': 'Global keybind for play/pause.'
                              'Uses gtk notation for keybinds.'
              },
              'global_next': {
                  'value': '<ctrl><alt>j',
                  'default': '<ctrl><alt>j',
                  'describe': 'Global keybind for next song.'
                              'Uses gtk notation for keybinds.'
              },
              'global_previous': {
                  'value': '<ctrl><alt>k',
                  'default': '<ctrl><alt>k',
                  'describe': 'Global keybind for previous song.'
                              'Uses gtk notation for keybinds.'
              },
              'notifier': {
                  'value': True,
                  'default': True,
                  'describe': 'Notifier when switching songs.'
              },
              'translation': {
                  'value': True,
                  'default': True,
                  'describe': 'Foreign language lyrics translation.'
              },
              'osdlyrics': {
                  'value': False,
                  'default': False,
                  'describe': 'Desktop lyrics for musicbox.'
              },
              'osdlyrics_transparent': {
                  'value': False,
                  'default': False,
                  'describe': 'Desktop lyrics transparent bg.'
              },
              'osdlyrics_color': {
                  'value': [225, 248, 113],
                  'default': [225, 248, 113],
                  'describe': 'Desktop lyrics RGB Color.'
              },
              'osdlyrics_font': {
                  'value': ['Decorative', 16],
                  'default': ['Decorative', 16],
                  'describe': 'Desktop lyrics font-family and font-size.'
              },
              'osdlyrics_background': {
                  'value': 'rgba(100, 100, 100, 120)',
                  'default': 'rgba(100, 100, 100, 120)',
                  'describe': 'Desktop lyrics background color.'
              },
              'osdlyrics_on_top': {
                  'value': True,
                  'default': True,
                  'describe': 'Desktop lyrics OnTopHint.'
              },
          }
          self.config = {}
          if not os.path.isfile(self.config_file_path):
              self.generate_config_file()
          try:
              f = file(self.config_file_path, 'r')
          except IOError:
              log.debug('Read config file error.')
              return
          try:
              self.config = json.loads(f.read())
          except ValueError:
              log.debug('Load config json data failed.')
              return
          f.close()
          if not self.check_version():
              self.save_config_file()
  
      def generate_config_file(self):
          f = file(self.config_file_path, 'w')
          f.write(json.dumps(self.default_config, indent=2))
          f.close()
  
      def save_config_file(self):
          f = file(self.config_file_path, 'w')
          f.write(json.dumps(self.config, indent=2))
          f.close()
  
      def check_version(self):
          if self.config['version'] == self.default_config['version']:
              return True
          else:
              # Should do some update. Like
              # if self.database['version'] == 2 : self.database.['version'] = 3
              # update database form version 1 to version 2
              if self.config['version'] == 1:
                  self.config['version'] = 2
                  self.config['global_play_pause'] = {
                      'value': '<ctrl><alt>p',
                      'default': '<ctrl><alt>p',
                      'describe': 'Global keybind for play/pause.'
                                  'Uses gtk notation for keybinds.'
                  }
                  self.config['global_next'] = {
                      'value': '<ctrl><alt>j',
                      'default': '<ctrl><alt>j',
                      'describe': 'Global keybind for next song.'
                                  'Uses gtk notation for keybinds.'
                  }
                  self.config['global_previous'] = {
                      'value': '<ctrl><alt>k',
                      'default': '<ctrl><alt>k',
                      'describe': 'Global keybind for previous song.'
                                  'Uses gtk notation for keybinds.'
                  }
              elif self.config['version'] == 2:
                  self.config['version'] = 3
                  self.config['notifier'] = {
                      'value': True,
                      'default': True,
                      'describe': 'Notifier when switching songs.'
                  }
              elif self.config['version'] == 3:
                  self.config['version'] = 4
                  self.config['translation'] = {
                      'value': True,
                      'default': True,
                      'describe': 'Foreign language lyrics translation.'
                  }
              elif self.config['version'] == 4:
                  self.config['version'] = 5
                  self.config['osdlyrics'] = {
                      'value': False,
                      'default': False,
                      'describe': 'Desktop lyrics for musicbox.'
                  }
                  self.config['osdlyrics_color'] = {
                      'value': [225, 248, 113],
                      'default': [225, 248, 113],
                      'describe': 'Desktop lyrics RGB Color.'
                  }
                  self.config['osdlyrics_font'] = {
                      'value': ['Decorative', 16],
                      'default': ['Decorative', 16],
                      'describe': 'Desktop lyrics font-family and font-size.'
                  }
                  self.config['osdlyrics_background'] = {
                      'value': 'rgba(100, 100, 100, 120)',
                      'default': 'rgba(100, 100, 100, 120)',
                      'describe': 'Desktop lyrics background color.'
                  }
                  self.config['osdlyrics_transparent'] = {
                      'value': False,
                      'default': False,
                      'describe': 'Desktop lyrics transparent bg.'
                  }
              elif self.config['version'] == 5:
                  self.config['version'] = 6
                  self.config['osdlyrics_on_top'] = {
                      'value': True,
                      'default': True,
                      'describe': 'Desktop lyrics OnTopHint.'
                  }
              self.check_version()
              return False
  
      def get_item(self, name):
          if name not in self.config.keys():
              if name not in self.default_config.keys():
                  return None
              return self.default_config[name]['value']
          return self.config[name]['value']
  