mycroft-core/mycroft/skills/audioservice.py

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() != {}