Fixing bunches of issues with the presenter
[watersofshiloah] / src / player.py
1 import logging
2
3 import gobject
4
5 import util.misc as misc_utils
6 import stream
7
8
9 _moduleLogger = logging.getLogger(__name__)
10
11
12 class Player(gobject.GObject):
13
14         __gsignals__ = {
15                 'state_change' : (
16                         gobject.SIGNAL_RUN_LAST,
17                         gobject.TYPE_NONE,
18                         (gobject.TYPE_PYOBJECT, ),
19                 ),
20                 'title_change' : (
21                         gobject.SIGNAL_RUN_LAST,
22                         gobject.TYPE_NONE,
23                         (gobject.TYPE_PYOBJECT, ),
24                 ),
25                 'error' : (
26                         gobject.SIGNAL_RUN_LAST,
27                         gobject.TYPE_NONE,
28                         (gobject.TYPE_PYOBJECT, gobject.TYPE_PYOBJECT),
29                 ),
30         }
31
32         STATE_PLAY = stream.GSTStream.STATE_PLAY
33         STATE_PAUSE = stream.GSTStream.STATE_PAUSE
34         STATE_STOP = stream.GSTStream.STATE_STOP
35
36         def __init__(self, index):
37                 gobject.GObject.__init__(self)
38                 self._index = index
39                 self._node = None
40
41                 self._stream = stream.GSTStream()
42                 self._stream.connect("state-change", self._on_stream_state)
43                 self._stream.connect("eof", self._on_stream_eof)
44                 self._stream.connect("error", self._on_stream_error)
45
46         def set_piece_by_node(self, node):
47                 assert node is None or node.is_leaf(), node
48                 if self._node is node:
49                         return
50                 self._node = node
51                 if self._node is not None:
52                         self._stream.set_file(self._node.uri)
53                 _moduleLogger.info("New node %r" % self._node)
54                 self.emit("title_change", self._node)
55
56         @property
57         def node(self):
58                 return self._node
59
60         @property
61         def title(self):
62                 if self._node is None:
63                         return ""
64                 return self._node.title
65
66         @property
67         def subtitle(self):
68                 if self._node is None:
69                         return ""
70                 return self._node.subtitle
71
72         @property
73         def can_navigate(self):
74                 if self._node is None:
75                         return False
76                 return self.node.can_navigate
77
78         @property
79         def state(self):
80                 return self._stream.state
81
82         def play(self):
83                 _moduleLogger.info("play")
84                 self._stream.play()
85
86         def pause(self):
87                 _moduleLogger.info("pause")
88                 self._stream.pause()
89
90         def stop(self):
91                 _moduleLogger.info("stop")
92                 self._stream.stop()
93                 self.set_piece_by_node(None)
94
95         def back(self):
96                 _moduleLogger.info("back")
97
98         def next(self):
99                 _moduleLogger.info("next")
100
101         @misc_utils.log_exception(_moduleLogger)
102         def _on_stream_state(self, s, state):
103                 _moduleLogger.info("State change %r" % state)
104                 self.emit("state_change", state)
105
106         @misc_utils.log_exception(_moduleLogger)
107         def _on_stream_eof(self, s, uri):
108                 _moduleLogger.info("EOF %s" % uri)
109                 self.next()
110
111         @misc_utils.log_exception(_moduleLogger)
112         def _on_stream_error(self, s, error, debug):
113                 _moduleLogger.info("Error %s %s" % (error, debug))
114                 self.emit("error", error, debug)
115
116
117 gobject.type_register(Player)