# -*- coding: utf-8 -*-
+# Copyright (c) 2009, 2010, 2011, 2013, 2014 Jack Kaliko <kaliko@azylum.org>
+#
+# This file is part of sima
+#
+# sima is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# sima is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with sima. If not, see <http://www.gnu.org/licenses/>.
+#
+#
"""Core Object dealing with plugins and player client
"""
-__version__ = '0.12.0.b'
-__author__ = 'kaliko jack'
-__url__ = 'git://git.kaliko.me/sima.git'
-
import sys
import time
from .client import PlayerClient
from .client import PlayerError, PlayerUnHandledError
from .lib.simadb import SimaDB
+from .lib.daemon import Daemon
+from .utils.utils import SigHup
-class Sima(object):
+class Sima(Daemon):
"""Main class, plugin and player management
"""
- def __init__(self, conf, dbfile):
+ def __init__(self, conf):
+ ## Set daemon
+ Daemon.__init__(self, conf.get('daemon', 'pidfile'))
self.enabled = True
self.config = conf
- self.sdb = SimaDB(db_path=dbfile)
+ self.sdb = SimaDB(db_path=conf.get('sima', 'db_file'))
+ PlayerClient.database = self.sdb
self.log = getLogger('sima')
self.plugins = list()
- self.player = self._get_player() # Player client
+ self.player = self.__get_player() # Player client
try:
self.player.connect()
except (PlayerError, PlayerUnHandledError) as err:
- self.log.error('Fails to connect player: {}'.format(err))
- self.shutdown()
+ self.log.warning('Player: {}'.format(err))
self.short_history = deque(maxlen=60)
- def _get_player(self):
+ def __get_player(self):
"""Instanciate the player"""
host = self.config.get('MPD', 'host')
port = self.config.get('MPD', 'port')
if pl_callback:
to_add.extend(pl_callback)
if not to_add:
- self.log.warning('Queue plugins returned anything!')
+ self.log.warning('Queue plugins returned nothing!')
for plugin in self.plugins:
- self.log.info('calling fb for {}'.format(plugin))
pl_callback = getattr(plugin, 'callback_need_track_fb')()
if pl_callback:
to_add.extend(pl_callback)
self.log.info('Got reconnected')
break
+ def hup_handler(self, signum, frame):
+ self.log.warning('Caught a sighup!')
+ self.player.disconnect()
+ self.foreach_plugin('shutdown')
+ raise SigHup('SIGHUP caught!')
+
def shutdown(self):
"""General shutdown method
"""
self.log.info('The way is shut, it was made by those who are dead. '
'And the dead keep it…')
self.log.info('bye...')
- sys.exit(0)
def run(self):
"""
except PlayerError as err:
self.log.warning('Player error: %s' % err)
self.reconnect_player()
+ del(self.changed)
def loop(self):
"""Dispatching callbacks to plugins