2 Minimal VLC VLM client for AceProxy. Client class.
10 from vlcmessages import *
13 class VlcException(Exception):
16 Exception from VlcClient
21 class VlcClient(object):
28 self, host='127.0.0.1', port=4212, password='admin', connect_timeout=5,
29 result_timeout=5, out_port=8081):
31 self._recvbuffer = None
33 self._out_port = out_port
37 self._resulttimeout = result_timeout
39 self._shuttingDown = gevent.event.Event()
40 # Authentication done event
41 self._auth = gevent.event.AsyncResult()
43 self._resultlock = gevent.coros.RLock()
45 self._result = gevent.event.AsyncResult()
49 self._password = password
52 logger = logging.getLogger('VlcClient_init')
56 self._socket = telnetlib.Telnet(host, port, connect_timeout)
57 logger.debug("Successfully connected with VLC socket!")
58 except Exception as e:
60 "Socket creation error! VLC is not running? ERROR: " + repr(e))
62 # Spawning recvData greenlet
63 gevent.spawn(self._recvData)
66 # Waiting for authentication event
68 if self._auth.get(timeout=self._resulttimeout) == False:
69 errmsg = "Authentication error"
71 raise VlcException(errmsg)
72 except gevent.Timeout:
73 errmsg = "Authentication timeout"
75 raise VlcException(errmsg)
78 # Destructor just calls destroy() method
83 logger = logging.getLogger("VlcClient_destroy")
85 if self._shuttingDown.isSet():
86 # Already in the middle of destroying
89 # If socket is still alive (connected)
92 logger.debug("Destroying VlcClient...")
93 self._write(VlcMessage.request.SHUTDOWN)
94 # Set shuttingDown flag for recvData
95 self._shuttingDown.set()
97 # Ignore exceptions on destroy
100 def _write(self, message):
101 # Return if in the middle of destroying
102 if self._shuttingDown.isSet():
107 print 'VLC command:',message
108 self._socket.write(message + "\r\n")
109 except EOFError as e:
110 raise VlcException("Vlc Write error! ERROR: " + repr(e))
112 def _broadcast(self, brtype, stream_name, input=None, muxer='ts', pre_access=''):
113 if self._shuttingDown.isSet():
116 # Start/stop broadcast with VLC
119 broadcast = 'startBroadcast'
121 broadcast = 'stopBroadcast'
123 logger = logging.getLogger("VlcClient_" + broadcast)
125 self._result = gevent.event.AsyncResult()
127 self._resultlock.acquire()
128 # Write message to VLC socket
130 self._write(VlcMessage.request.startBroadcast(
131 stream_name, input, self._out_port, muxer, pre_access))
133 self._write(VlcMessage.request.stopBroadcast(stream_name))
137 result = self._result.get(timeout=self._resulttimeout)
139 logger.error(broadcast + " error")
140 raise VlcException(broadcast + " error")
141 except gevent.Timeout:
142 logger.error(broadcast + " result timeout")
143 raise VlcException(broadcast + " result timeout")
145 self._resultlock.release()
148 logger.debug("Broadcast started")
150 logger.debug("Broadcast stopped")
152 def startBroadcast(self, stream_name, input, muxer='ts', pre_access=''):
153 return self._broadcast(True, stream_name, input, muxer, pre_access)
155 def stopBroadcast(self, stream_name):
156 return self._broadcast(False, stream_name)
158 def pauseBroadcast(self, stream_name):
159 return self._write(VlcMessage.request.pauseBroadcast(stream_name))
161 def playBroadcast(self, stream_name):
162 return self._write(VlcMessage.request.playBroadcast(stream_name))
166 logger = logging.getLogger("VlcClient_recvData")
171 self._recvbuffer = self._socket.read_until("\n")
172 # Stripping "> " from VLC
173 self._recvbuffer = self._recvbuffer.lstrip("> ")
175 # If something happened during read, abandon reader
176 if not self._shuttingDown.isSet():
177 logger.error("Exception at socket read")
178 self._shuttingDown.set()
181 # Parsing everything only if the string is not empty
184 # First line (VLC version)
185 self._vlcver = self._recvbuffer.strip()
186 # Send password here since PASSWORD doesn't have \n
187 self._write(self._password)
189 elif self._recvbuffer.startswith(VlcMessage.response.SHUTDOWN):
190 # Exit from this loop
191 logger.debug("Got SHUTDOWN from VLC")
194 elif self._recvbuffer.startswith(VlcMessage.response.WRONGPASS):
196 logger.error("Wrong VLC password!")
197 self._auth.set(False)
200 elif self._recvbuffer.startswith(VlcMessage.response.AUTHOK):
202 logger.info("Authentication successful")
205 elif VlcMessage.response.BROADCASTEXISTS in self._recvbuffer:
206 # Broadcast already exists
207 logger.error("Broadcast already exists!")
208 self._result.set(False)
210 elif VlcMessage.response.STOPERR in self._recvbuffer:
211 # Media unknown (stopping non-existent stream)
212 logger.error("Broadcast does not exist!")
213 self._result.set(False)
215 # Do not move this before error handlers!
216 elif self._recvbuffer.startswith(VlcMessage.response.STARTOK):
218 logger.debug("Broadcast started")
219 self._result.set(True)
221 elif self._recvbuffer.startswith(VlcMessage.response.STOPOK):
223 logger.debug("Broadcast stopped")
224 self._result.set(True)