mpc.py 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. from __future__ import print_function
  2. from gevent import monkey
  3. monkey.patch_all(subprocess=True)
  4. import logging
  5. logging.basicConfig(level=logging.INFO,
  6. format='%(asctime)s %(message)s',
  7. datefmt='%H:%M:%S')
  8. import signal
  9. import gevent
  10. from gevent.queue import Queue
  11. from gevent.wsgi import WSGIServer
  12. from mpd import MPDClient
  13. from eventutils import ParentedLet, CeleryTask, Timer
  14. from task import create as create_continous
  15. import rpc
  16. class MpcWatcher(ParentedLet):
  17. def __init__(self, queue, client=None):
  18. ParentedLet.__init__(self, queue)
  19. if client is None:
  20. self.client = MPDClient()
  21. # TODO: use config values
  22. self.client.connect("localhost", 6600)
  23. else:
  24. self.client = client # assume it is already connected
  25. def do_business(self):
  26. while True:
  27. # status = check_output(['mpc', 'idle']).decode('utf-8').strip()
  28. status = self.client.idle()[0]
  29. logging.info(status)
  30. yield ('mpc', status)
  31. class Player(gevent.Greenlet):
  32. def __init__(self):
  33. gevent.Greenlet.__init__(self)
  34. self.min_playlist_length = 10
  35. self.q = Queue()
  36. def check_playlist(self):
  37. mpd_client = MPDClient()
  38. # TODO: use config values
  39. mpd_client.connect("localhost", 6600)
  40. songs = mpd_client.playlist()
  41. if(len(songs) >= self.min_playlist_length):
  42. return
  43. logging.info('need to add new songs')
  44. CeleryTask(create_continous, self.q).start()
  45. CeleryTask(create_continous, self.q).start()
  46. def _run(self):
  47. MpcWatcher(self.q, client=None).start()
  48. Timer(6000, self.q).start()
  49. http_server = WSGIServer(('', 5000), rpc.create_app(self.q))
  50. http_server.start()
  51. while True:
  52. value = self.q.get()
  53. # emitter = value['emitter']
  54. kind = value['kind']
  55. args = value['args']
  56. if kind == 'timer':
  57. logging.info('CLOCK')
  58. if kind == 'timer' or (kind == 'mpc' and args[0] == 'playlist'):
  59. gevent.Greenlet.spawn(self.check_playlist)
  60. elif kind == 'celery':
  61. logging.info("celery: %s" % str(args))
  62. else:
  63. logging.warning("Unknown message: %s" % str(value))
  64. logging.info(str(value))
  65. def on_player_crash(*args, **kwargs):
  66. print('A crash occurred in "main" greenlet. Aborting...')
  67. import sys
  68. sys.exit(1)
  69. if __name__ == '__main__':
  70. p = Player()
  71. p.start()
  72. p.link_exception(on_player_crash)
  73. def sig(*args):
  74. print('invoked sig', args)
  75. p.q.put('signal', *args)
  76. gevent.signal(signal.SIGHUP, sig, signal.SIGHUP)
  77. gevent.wait()