scripts/mycroft/audio/services/vlc/__init__.py
Go to the documentation of this file.
1 # Copyright 2017 Mycroft AI Inc.
2 #
3 # Licensed under the Apache License, Version 2.0 (the "License");
4 # you may not use this file except in compliance with the License.
5 # You may obtain a copy of the License at
6 #
7 # http://www.apache.org/licenses/LICENSE-2.0
8 #
9 # Unless required by applicable law or agreed to in writing, software
10 # distributed under the License is distributed on an "AS IS" BASIS,
11 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 # See the License for the specific language governing permissions and
13 # limitations under the License.
14 #
15 import vlc
16 
17 from mycroft.audio.services import AudioBackend
18 from mycroft.util.log import LOG
19 
20 
22  def __init__(self, config, bus=None, name='vlc'):
23  super(VlcService, self).__init__(config, bus)
24  self.instance = vlc.Instance()
25  self.list_player = self.instance.media_list_player_new()
26  self.player = self.instance.media_player_new()
27  self.list_player.set_media_player(self.player)
28  self.track_list = self.instance.media_list_new()
29  self.list_player.set_media_list(self.track_list)
30  self.vlc_events = self.player.event_manager()
31  self.vlc_events.event_attach(vlc.EventType.MediaPlayerPlaying,
32  self.track_start, 1)
33  self.config = config
34  self.bus = bus
35  self.name = name
36  self.normal_volume = None
37  self.low_volume = self.config.get('low_volume', 30)
38 
39  def track_start(self, data, other):
40  if self._track_start_callback:
41  self._track_start_callback(self.track_info()['name'])
42 
43  def supported_uris(self):
44  return ['file', 'http', 'https']
45 
46  def clear_list(self):
47  # Create a new media list
48  self.track_list = self.instance.media_list_new()
49  # Set list as current track list
50  self.list_player.set_media_list(self.track_list)
51 
52  def add_list(self, tracks):
53  LOG.debug("Track list is " + str(tracks))
54  for t in tracks:
55  self.track_list.add_media(self.instance.media_new(t))
56 
57  def play(self, repeat=False):
58  """ Play playlist using vlc. """
59  LOG.debug('VLCService Play')
60  if repeat:
61  self.list_player.set_playback_mode(vlc.PlaybackMode.loop)
62  else:
63  self.list_player.set_playback_mode(vlc.PlaybackMode.default)
64 
65  self.list_player.play()
66 
67  def stop(self):
68  """ Stop vlc playback. """
69  LOG.info('VLCService Stop')
70  if self.player.is_playing():
71  # Restore volume if lowered
72  self.restore_volume()
73  self.clear_list()
74  self.list_player.stop()
75  return True
76  else:
77  return False
78 
79  def pause(self):
80  """ Pause vlc playback. """
81  self.player.set_pause(1)
82 
83  def resume(self):
84  """ Resume paused playback. """
85  self.player.set_pause(0)
86 
87  def next(self):
88  """ Skip to next track in playlist. """
89  self.list_player.next()
90 
91  def previous(self):
92  """ Skip to previous track in playlist. """
93  self.list_player.previous()
94 
95  def lower_volume(self):
96  """ Lower volume (will be called when mycroft is listening
97  or speaking.
98  """
99  # Lower volume if playing, volume isn't already lowered
100  # and ducking is enabled
101  if (self.normal_volume is None and self.player.is_playing() and
102  self.config.get('duck', False)):
103  self.normal_volume = self.player.audio_get_volume()
104  self.player.audio_set_volume(self.low_volume)
105 
106  def restore_volume(self):
107  """ Restore volume to previous level. """
108  # if vlc has been lowered restore the volume
109  if self.normal_volume:
110  self.player.audio_set_volume(self.normal_volume)
111  self.normal_volume = None
112 
113  def track_info(self):
114  """ Extract info of current track. """
115  ret = {}
116  meta = vlc.Meta
117  t = self.player.get_media()
118  ret['album'] = t.get_meta(meta.Album)
119  ret['artists'] = [t.get_meta(meta.Artist)]
120  ret['name'] = t.get_meta(meta.Title)
121  return ret
122 
123  def seek_forward(self, seconds=1):
124  """
125  skip X seconds
126 
127  Args:
128  seconds (int): number of seconds to seek, if negative rewind
129  """
130  seconds = seconds * 1000
131  new_time = self.player.get_time() + seconds
132  duration = self.player.get_length()
133  if new_time > duration:
134  new_time = duration
135  self.player.set_time(new_time)
136 
137  def seek_backward(self, seconds=1):
138  """
139  rewind X seconds
140 
141  Args:
142  seconds (int): number of seconds to seek, if negative rewind
143  """
144  seconds = seconds * 1000
145  new_time = self.player.get_time() - seconds
146  if new_time < 0:
147  new_time = 0
148  self.player.set_time(new_time)
149 
150 
151 def load_service(base_config, bus):
152  backends = base_config.get('backends', [])
153  services = [(b, backends[b]) for b in backends
154  if backends[b]['type'] == 'vlc' and
155  backends[b].get('active', True)]
156  instances = [VlcService(s[1], bus, s[0]) for s in services]
157  return instances
def get(phrase, lang=None, context=None)


mycroft_ros
Author(s):
autogenerated on Mon Apr 26 2021 02:35:40