]> kaliko git repositories - mpd-sima.git/blob - launch
Huge commit… Running last.fm track mode
[mpd-sima.git] / launch
1 #!/usr/bin/env python3
2 # -*- coding: utf-8 -*-
3 """Sima
4 """
5
6 # standart library import
7 import logging
8 import sys
9
10 from importlib import __import__
11 from os.path import isfile, basename
12 ##
13
14 # third parties components
15 ##
16
17 # local import
18 from sima import core
19 from sima.lib.logger import set_logger
20 from sima.lib.simadb import SimaDB
21 from sima.utils.config import ConfMan
22 from sima.utils.startopt import StartOpt
23 from sima.utils.utils import exception_log
24 ##
25 # internal plugins
26 from sima.plugins.crop import Crop
27 from sima.plugins.addhist import History
28 from sima.plugins.lastfm import Lastfm
29 from sima.plugins.mpd import MpdOptions
30
31 # official plugins to start
32 PLUGINS = (Crop, History, MpdOptions,
33            Lastfm)
34
35
36 def load_contrib_plugins(sima):
37     """Handles contrib/external plugins
38     """
39     if not sima.config.has_option('sima', 'plugins'):
40         return
41     logger = logging.getLogger('sima')
42     for plugin in sima.config.get('sima','plugins').split(','):
43         plugin = plugin.strip(' \n')
44         module = 'sima.plugins.contrib.{}'.format(plugin.lower())
45         try:
46             mod_obj = __import__(module, fromlist=[plugin])
47         except ImportError as err:
48             logger.error('Failed to load plugin\'s module: {0} ({1})'.format(module, err))
49             sima.shutdown()
50         try:
51             plugin_obj = getattr(mod_obj, plugin)
52         except AttributeError as err:
53             logger.error('Failed to load plugin {0} ({1})'.format(plugin, err))
54             sima.shutdown()
55         logger.info('Loading contrib plugin: {name} ({doc})'.format(**plugin_obj.info()))
56         sima.register_plugin(plugin_obj)
57
58
59 def load_internal_plugins(sima):
60     """Handles contrib/external plugins
61     """
62     raise NotImplementedError
63
64
65 def main():
66     """Entry point, deal w/ CLI and starts application
67     """
68     info = dict({'version': core.__version__,})
69     # StartOpt gathers options from command line call (in StartOpt().options)
70     sopt = StartOpt(info)
71     # set logger
72     verbosity = sopt.options.get('verbosity', 'warning')
73     cli_loglevel = getattr(logging, verbosity.upper())
74     set_logger(level=verbosity)
75     logger = logging.getLogger('sima')
76     logger.setLevel(cli_loglevel)
77     # loads configuration
78     conf_manager = ConfMan(logger, sopt.options)
79     config = conf_manager.config
80     logger.setLevel(getattr(logging,
81                     config.get('log', 'verbosity').upper()))  # pylint: disable=E1103
82
83     logger.debug('Command line say: {0}'.format(sopt.options))
84
85     # Create Database
86     if (sopt.options.get('create_db', None)
87        or not isfile(conf_manager.db_file)):
88         logger.info('Creating database in "{}"'.format(conf_manager.db_file))
89         open(conf_manager.db_file, 'a').close()
90         SimaDB(db_path=conf_manager.db_file).create_db()
91         if sopt.options.get('create_db', None):
92             logger.info('Done, bye...')
93             sys.exit(0)
94
95     logger.info('Starting...')
96     sima = core.Sima(config, conf_manager.db_file)
97
98     #  Loading internal plugins
99     for plugin in PLUGINS:
100         logger.info('Loading internal plugin: {name} ({doc})'.format(**plugin.info()))
101         sima.register_plugin(plugin)
102
103     #  Loading contrib plugins
104     load_contrib_plugins(sima)
105     try:
106         sima.run()
107     except KeyboardInterrupt:
108         logger.info('Caught KeyboardInterrupt, stopping')
109         sima.shutdown()
110
111
112 # Script starts here
113 if __name__ == '__main__':
114     # pylint: disable=broad-except
115     try:
116         main()
117     except Exception:
118         exception_log()
119
120
121 # VIM MODLINE
122 # vim: ai ts=4 sw=4 sts=4 expandtab