try:
import asyncio
except ImportError:
+ import sys
print('Failed to import asyncio, need python >= 3.4')
+ sys.exit(1)
import logging
+from os import environ
+if 'DEBUG' in environ or 'PYTHONASYNCIODEBUG' in environ:
+ logging.basicConfig(level=logging.DEBUG)
+
HELLO_PREFIX = "OK MPD "
ERROR_PREFIX = "ACK "
SUCCESS = "OK"
def __init__(self):
self.version = None
self.resp = ''
- self.err = None
def __repr__(self):
- return 'err:{0}, "{1}…" ({2})'.format(
- self.err,
+ return '"{0}…" ({1})'.format(
' '.join(self.resp.split('\n')[:2]),
self.version)
self.sess.resp += rcv
if rcv.endswith(SUCCESS+'\n'):
+ logging.debug('set future result')
self.transport.close()
self.future.set_result(self.sess)
if rcv.startswith(HELLO_PREFIX):
logging.debug('consumed hello prefix')
self.sess.version = rcv.split('\n')[0][len(HELLO_PREFIX):]
- #print('consumed hello prefix: %s' % self.sess.version)
return rcv[rcv.find('\n')+1:]
return rcv
class MPDClient:
- loop = asyncio.get_event_loop()
def __init__(self, host='localhost', port=6600, cred=None):
+ self.eloop = asyncio.get_event_loop()
+ self.asio = False
+ self.futures = []
self._host = host
self._port = port
self._cred = cred
}
def __getattr__(self, attr):
+ #logging.debug(attr)
command = attr
wrapper = self._command
if command not in self._commands:
# coroutine allowing Exception handling
# src: http://comments.gmane.org/gmane.comp.python.tulip/1401
try:
- yield from MPDClient.loop.create_connection(lambda: proto,
+ yield from self.eloop.create_connection(lambda: proto,
host=self._host,
port=self._port)
except Exception as err:
# kick off a task to create the connection to MPD
coro = self._connect(MPDProto(future, payload, self._cred))
asyncio.async(coro)
- MPDClient.loop.run_until_complete(future)
- # return once completed.
- return future.result().resp
+ self.futures.append(future)
+ if not self.asio:
+ # return once completed.
+ self.eloop.run_until_complete(future)
+ return future
+ # alternative w/ callback
+ #if not self.asio:
+ # future.add_done_callback(lambda ftr: MPDClient.loop.stop())
+ # self.eloop.run_forever()
+ #return future
+
+ def run(self):
+ if self.futures:
+ self.eloop.run_until_complete(asyncio.gather(*self.futures))
+ self.futures = []
+ else:
+ logging.info('No task found in queue, need to set self.asio?')