import util.misc as misc_utils
import stream
+import stream_index
import call_monitor
gobject.GObject.__init__(self)
self._index = index
self._node = None
+ self._nextSearch = None
self._calls = call_monitor.CallMonitor()
self._calls.connect("call_start", self._on_call_start)
self._stream.connect("error", self._on_stream_error)
def set_piece_by_node(self, node):
- assert node is None or node.is_leaf(), node
- if self._node is node:
- return
- self._node = node
- if self._node is not None:
- self._stream.set_file(self._node.uri)
- _moduleLogger.info("New node %r" % self._node)
- self.emit("title_change", self._node)
+ self._set_piece_by_node(node)
@property
def node(self):
def back(self):
_moduleLogger.info("back")
+ assert self._nextSearch is None
+ self._nextSearch = stream_index.AsyncWalker(stream_index.get_previous)
+ self._nextSearch.start(self.node, self._on_next_node, self._on_node_search_error)
def next(self):
_moduleLogger.info("next")
+ assert self._nextSearch is None
+ self._nextSearch = stream_index.AsyncWalker(stream_index.get_next)
+ self._nextSearch.start(self.node, self._on_next_node, self._on_node_search_error)
+
+ def seek(self, percent):
+ target = percent * self._stream.duration
+ self._stream.seek_time(target)
+
+ @property
+ def percent_elapsed(self):
+ percent = float(self._stream.elapsed) / float(self._stream.duration)
+ return percent
+
+ def _set_piece_by_node(self, node):
+ assert node is None or node.is_leaf(), node
+ if self._node is node:
+ _moduleLogger.info("Already set to %r" % node)
+ return
+ self._node = node
+ if self._node is not None:
+ self._stream.set_file(self._node.uri)
+ _moduleLogger.info("New node %r" % self._node)
+ self.emit("title_change", self._node)
+
+ @misc_utils.log_exception(_moduleLogger)
+ def _on_next_node(self, node):
+ self._nextSearch = None
+
+ restart = self.state == self.STATE_PLAY
+ self._set_piece_by_node(node)
+ if restart:
+ self.play()
+
+ @misc_utils.log_exception(_moduleLogger)
+ def _on_node_search_error(self, e):
+ self._nextSearch = None
+ self.emit("error", e, "")
@misc_utils.log_exception(_moduleLogger)
def _on_stream_state(self, s, state):