Browse Source

Add built-in Playable queue

pull/44/head
Andrei 8 years ago
parent
commit
4d2114aef9
  1. 6
      disco/voice/player.py
  2. 31
      disco/voice/queue.py
  3. 28
      tests/tests_voice_queue.py

6
disco/voice/player.py

@ -1,11 +1,11 @@
import time import time
import gevent import gevent
from six.moves import queue
from holster.enum import Enum from holster.enum import Enum
from holster.emitter import Emitter from holster.emitter import Emitter
from disco.voice.client import VoiceState from disco.voice.client import VoiceState
from disco.voice.queue import PlayableQueue
MAX_TIMESTAMP = 4294967295 MAX_TIMESTAMP = 4294967295
@ -19,11 +19,11 @@ class Player(object):
'DISCONNECT' 'DISCONNECT'
) )
def __init__(self, client): def __init__(self, client, queue=None):
self.client = client self.client = client
# Queue contains playable items # Queue contains playable items
self.queue = queue.Queue() self.queue = queue or PlayableQueue()
# Whether we're playing music (true for lifetime) # Whether we're playing music (true for lifetime)
self.playing = True self.playing = True

31
disco/voice/queue.py

@ -0,0 +1,31 @@
import abc
import six
import gevent
@six.add_metaclass(abc.ABCMeta)
class BaseQueue(object):
@abc.abstractmethod
def get(self):
raise NotImplementedError
class PlayableQueue(BaseQueue):
def __init__(self):
self._data = []
self._event = gevent.event.Event()
def append(self, item):
self._data.append(item)
if self._event:
self._event.set()
self._event = None
def get(self):
if not len(self._data):
if not self._event:
self._event = gevent.event.Event()
self._event.wait()
return self.get()
return self._data.pop(0)

28
tests/tests_voice_queue.py

@ -0,0 +1,28 @@
import gevent
from unittest import TestCase
from disco.voice.queue import PlayableQueue
class TestPlayableQueue(TestCase):
def test_append(self):
q = PlayableQueue()
q.append(1)
q.append(2)
q.append(3)
self.assertEqual(q._data, [1, 2, 3])
self.assertEqual(q.get(), 1)
self.assertEqual(q.get(), 2)
self.assertEqual(q.get(), 3)
def test_blocking_get(self):
q = PlayableQueue()
result = gevent.event.AsyncResult()
def get():
result.set(q.get())
gevent.spawn(get)
q.append(5)
self.assertEqual(result.get(), 5)
Loading…
Cancel
Save