92 lines
2.5 KiB
Python
92 lines
2.5 KiB
Python
import time
|
|
from os.path import abspath
|
|
from mycroft.messagebus.message import Message
|
|
|
|
|
|
def ensure_uri(s):
|
|
"""
|
|
Interprete paths as file:// uri's
|
|
|
|
Args:
|
|
s: string to be checked
|
|
|
|
Returns:
|
|
if s is uri, s is returned otherwise file:// is prepended
|
|
"""
|
|
if '://' not in s:
|
|
return 'file://' + abspath(s)
|
|
else:
|
|
return s
|
|
|
|
|
|
class AudioService():
|
|
"""
|
|
AudioService object for interacting with the audio subsystem
|
|
|
|
Args:
|
|
emitter: eventemitter or websocket object
|
|
"""
|
|
def __init__(self, emitter):
|
|
self.emitter = emitter
|
|
self.emitter.on('mycroft.audio.service.track_info_reply',
|
|
self._track_info)
|
|
self.info = None
|
|
|
|
def _track_info(self, message=None):
|
|
"""
|
|
Handler for catching returning track info
|
|
"""
|
|
self.info = message.data
|
|
|
|
def play(self, tracks=[], utterance=''):
|
|
""" Start playback.
|
|
|
|
Args:
|
|
tracks: track uri or list of track uri's
|
|
utterance: forward utterance for further processing by the
|
|
audio service.
|
|
"""
|
|
if isinstance(tracks, basestring):
|
|
tracks = [tracks]
|
|
elif not isinstance(tracks, list):
|
|
raise ValueError
|
|
tracks = [ensure_uri(t) for t in tracks]
|
|
self.emitter.emit(Message('mycroft.audio.service.play',
|
|
data={'tracks': tracks,
|
|
'utterance': utterance}))
|
|
|
|
def next(self):
|
|
""" Change to next track. """
|
|
self.emitter.emit(Message('mycroft.audio.service.next'))
|
|
|
|
def prev(self):
|
|
""" Change to previous track. """
|
|
self.emitter.emit(Message('mycroft.audio.service.prev'))
|
|
|
|
def pause(self):
|
|
""" Pause playback. """
|
|
self.emitter.emit(Message('mycroft.audio.service.pause'))
|
|
|
|
def resume(self):
|
|
""" Resume paused playback. """
|
|
self.emitter.emit(Message('mycroft.audio.service.resume'))
|
|
|
|
def track_info(self):
|
|
""" Request information of current playing track.
|
|
|
|
Returns:
|
|
Dict with track info.
|
|
"""
|
|
self.info = None
|
|
self.emitter.emit(Message('mycroft.audio.service.track_info'))
|
|
wait = 5.0
|
|
while self.info is None and wait >= 0:
|
|
time.sleep(0.1)
|
|
wait -= 0.1
|
|
|
|
return self.info or {}
|
|
|
|
@property
|
|
def is_playing(self):
|
|
return self.track_info() != {}
|