2 # -*- coding: utf-8 -*-
3 """Core Object dealing with plugins and player client
6 __version__ = '0.12.0.b'
7 __author__ = 'kaliko jack'
8 __url__ = 'git://git.kaliko.me/sima.git'
13 from logging import getLogger
15 from .client import PlayerClient, Track
16 from .client import PlayerError, PlayerUnHandledError
17 from .lib.simadb import SimaDB
20 """Main class, plugin and player management
23 def __init__(self, conf, dbfile):
25 self.sdb = SimaDB(db_path=dbfile)
26 self.log = getLogger('sima')
28 self.player = PlayerClient() # Player client
31 except (PlayerError, PlayerUnHandledError) as err:
32 self.log.error('Fails to connect player: {}'.format(err))
34 self.current_track = None
36 def register_plugin(self, plugin_class):
37 """Registers plubin in Sima instance..."""
38 self.plugins.append(plugin_class(self))
40 def foreach_plugin(self, method, *args, **kwds):
41 """Plugin's callbacks dispatcher"""
42 for plugin in self.plugins:
43 getattr(plugin, method)(*args, **kwds)
45 def reconnect_player(self):
46 """Trying to reconnect cycling through longer timeout
47 cycle : 5s 10s 1m 5m 20m 1h
49 sleepfor = [5, 10, 60, 300, 1200, 3600]
53 self.log.info('Trying to reconnect in {:>4d} seconds'.format(tmp))
59 except PlayerUnHandledError as err:
60 #TODO: unhandled Player exceptions
61 self.log.warning('Unhandled player exception: %s' % err)
62 self.log.info('Got reconnected')
66 """General shutdown method
68 self.log.warning('Starting shutdown.')
69 self.player.disconnect()
70 self.foreach_plugin('shutdown')
72 self.log.info('The way is shut, it was made by those who are dead. '
73 'And the dead keep it…')
74 self.log.info('bye...')
80 self.current_track = Track()
84 except PlayerUnHandledError as err:
85 #TODO: unhandled Player exceptions
86 self.log.warning('Unhandled player exception: {}'.format(err))
88 self.player = PlayerClient()
90 except PlayerError as err:
91 self.log.warning('Player error: %s' % err)
92 self.reconnect_player()
95 """Dispatching callbacks to plugins
97 # hanging here untill a monitored event is raised in the player
98 if getattr(self, 'changed', False): # first loop detection
99 self.changed = self.player.monitor()
101 self.changed = ['playlist', 'player', 'skipped']
102 self.log.debug('changed: {}'.format(', '.join(self.changed)))
103 if 'playlist' in self.changed:
104 self.foreach_plugin('callback_playlist')
105 if 'player' in self.changed:
106 self.foreach_plugin('callback_player')
107 if 'skipped' in self.changed:
108 if self.player.state == 'play':
109 self.log.info('Playing: {}'.format(self.player.current))
110 self.foreach_plugin('callback_next_song')
111 self.current_track = self.player.current
115 # vim: ai ts=4 sw=4 sts=4 expandtab