4779ba5be4a79cdcdc22c9f4568c4fb4b9f44036
[nqaap] / src / opt / Nqa-Audiobook-player / SimpleGStreamer.py
1 import os
2 import logging
3
4 import gst
5
6 import gtk_toolbox
7
8
9 _moduleLogger = logging.getLogger(__name__)
10
11
12 class SimplePlayer(object):
13
14     def __init__(self, on_playing_done = None):
15         #Fields
16         self.playing = False
17         self.__filename = ""
18         self.__elapsed = 0
19         self.__duration = 0
20
21         #Event callbacks
22         self.on_playing_done = on_playing_done
23
24         #Set up GStreamer
25         self.player = gst.element_factory_make("playbin2", "player")
26         fakesink = gst.element_factory_make("fakesink", "fakesink")
27         self.player.set_property("video-sink", fakesink)
28         bus = self.player.get_bus()
29         bus.add_signal_watch()
30         bus.connect("message", self.on_message)
31
32         #Constants
33         self.time_format = gst.Format(gst.FORMAT_TIME)
34         self.seek_flag = gst.SEEK_FLAG_FLUSH
35
36     @property
37     def has_file(self):
38         return 0 < len(self.__filename)
39
40     @gtk_toolbox.log_exception(_moduleLogger)
41     def on_message(self, bus, message):
42         t = message.type
43         if t == gst.MESSAGE_EOS:        # End-Of-Stream
44             self.player.set_state(gst.STATE_NULL)
45             self.playing = False
46             if self.on_playing_done is not None: # event callback
47                 self.on_playing_done(self)
48         elif t == gst.MESSAGE_ERROR:
49             self.player.set_state(gst.STATE_NULL)
50             err, debug = message.parse_error()
51             #print "Error: %s" % err, debug
52             _moduleLogger.error("Error: %s, (%s)" % (err, debug))
53             self.playing = False
54
55     def set_file(self, file):
56         _moduleLogger.info("set file: %s", file)
57         if os.path.isfile(file):
58             if self.__filename != file:
59                 self._invalidate_cache()
60             if self.playing:
61                 self.stop()
62
63             file = os.path.abspath(file) # ensure absolute path
64             _moduleLogger.debug("set file (absolute path): %s "%file)
65             self.player.set_property("uri", "file://" + file)
66             self.__filename = file
67         else:
68             _moduleLogger.error("File: %s not found" % file)
69
70     def play(self):
71         _moduleLogger.info("Started playing")
72         self.player.set_state(gst.STATE_PLAYING)
73         self.playing = True
74
75     def stop(self):
76         self.player.set_state(gst.STATE_NULL)
77         self.playing = False
78         _moduleLogger.info("Stopped playing")
79
80     def elapsed(self):
81         try:
82             self.__elapsed = self.player.query_position(self.time_format, None)[0]
83         except:
84             pass
85         return self.__elapsed
86
87     def duration(self):
88         try:
89             self.__duration = self.player.query_duration(self.time_format, None)[0]
90         except:
91             _moduleLogger.exception("Query failed")
92             pass
93         return self.__duration
94
95     def seek_time(self, ns):
96         _moduleLogger.debug("Seeking to: %s", ns)
97         self.player.seek_simple(self.time_format, self.seek_flag, ns)
98
99     def _invalidate_cache(self):
100         self.__elapsed = 0
101         self.__duration = 0
102
103     def __seek_percent(self, percent):
104         format = gst.Format(gst.FORMAT_PERCENT)
105         self.player.seek_simple(format, self.seek_flag, percent)