9 _moduleLogger = logging.getLogger(__name__)
12 class SimplePlayer(object):
14 # @todo Add pitch/speed control
15 # http://github.com/jwagner/playitslowly/blob/master/playitslowly/pipeline.py
17 def __init__(self, on_playing_done = None):
25 self.on_playing_done = on_playing_done
28 self.player = gst.element_factory_make("playbin2", "player")
29 fakesink = gst.element_factory_make("fakesink", "fakesink")
30 self.player.set_property("video-sink", fakesink)
31 bus = self.player.get_bus()
32 bus.add_signal_watch()
33 bus.connect("message", self.on_message)
36 self.time_format = gst.Format(gst.FORMAT_TIME)
37 self.seek_flag = gst.SEEK_FLAG_FLUSH
41 return 0 < len(self.__filename)
43 @gtk_toolbox.log_exception(_moduleLogger)
44 def on_message(self, bus, message):
46 if t == gst.MESSAGE_EOS: # End-Of-Stream
47 self.player.set_state(gst.STATE_NULL)
49 if self.on_playing_done is not None: # event callback
50 self.on_playing_done(self)
51 elif t == gst.MESSAGE_ERROR:
52 self.player.set_state(gst.STATE_NULL)
53 err, debug = message.parse_error()
54 #print "Error: %s" % err, debug
55 _moduleLogger.error("Error: %s, (%s)" % (err, debug))
58 def set_file(self, file):
59 _moduleLogger.info("set file: %s", file)
60 if os.path.isfile(file):
61 if self.__filename != file:
62 self._invalidate_cache()
66 file = os.path.abspath(file) # ensure absolute path
67 _moduleLogger.debug("set file (absolute path): %s "%file)
68 self.player.set_property("uri", "file://" + file)
69 self.__filename = file
71 _moduleLogger.error("File: %s not found" % file)
74 _moduleLogger.info("Started playing")
75 self.player.set_state(gst.STATE_PLAYING)
79 self.player.set_state(gst.STATE_NULL)
81 _moduleLogger.info("Stopped playing")
85 self.__elapsed = self.player.query_position(self.time_format, None)[0]
92 self.__duration = self.player.query_duration(self.time_format, None)[0]
94 _moduleLogger.exception("Query failed")
96 return self.__duration
98 def seek_time(self, ns):
99 _moduleLogger.debug("Seeking to: %s", ns)
100 self.player.seek_simple(self.time_format, self.seek_flag, ns)
102 def _invalidate_cache(self):
106 def __seek_percent(self, percent):
107 format = gst.Format(gst.FORMAT_PERCENT)
108 self.player.seek_simple(format, self.seek_flag, percent)