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=10,
29 result_timeout=10, 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='', qtype='default'):
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 msg = VlcMessage.request.startBroadcast(stream_name, input, self._out_port, muxer, pre_access, qtype)
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='', qtype='default'):
153 print "Starting broadcast......"
154 return self._broadcast(True, stream_name, input, muxer, pre_access, qtype)
156 def stopBroadcast(self, stream_name):
157 return self._broadcast(False, stream_name)
159 def pauseBroadcast(self, stream_name):
160 return self._write(VlcMessage.request.pauseBroadcast(stream_name))
162 def playBroadcast(self, stream_name):
163 return self._write(VlcMessage.request.playBroadcast(stream_name))
167 logger = logging.getLogger("VlcClient_recvData")
172 self._recvbuffer = self._socket.read_until("\n")
173 # Stripping "> " from VLC
174 self._recvbuffer = self._recvbuffer.lstrip("> ")
176 # If something happened during read, abandon reader
177 if not self._shuttingDown.isSet():
178 logger.error("Exception at socket read")
179 self._shuttingDown.set()
182 # Parsing everything only if the string is not empty
185 # First line (VLC version)
186 self._vlcver = self._recvbuffer.strip()
187 # Send password here since PASSWORD doesn't have \n
188 self._write(self._password)
190 elif self._recvbuffer.startswith(VlcMessage.response.SHUTDOWN):
191 # Exit from this loop
192 logger.debug("Got SHUTDOWN from VLC")
195 elif self._recvbuffer.startswith(VlcMessage.response.WRONGPASS):
197 logger.error("Wrong VLC password!")
198 self._auth.set(False)
201 elif self._recvbuffer.startswith(VlcMessage.response.AUTHOK):
203 logger.info("Authentication successful")
206 elif VlcMessage.response.BROADCASTEXISTS in self._recvbuffer:
207 # Broadcast already exists
208 logger.error("Broadcast already exists!")
209 self._result.set(False)
211 elif VlcMessage.response.STOPERR in self._recvbuffer:
212 # Media unknown (stopping non-existent stream)
213 logger.error("Broadcast does not exist!")
214 self._result.set(False)
216 # Do not move this before error handlers!
217 elif self._recvbuffer.startswith(VlcMessage.response.STARTOK):
219 logger.debug("Broadcast started")
220 self._result.set(True)
222 elif self._recvbuffer.startswith(VlcMessage.response.STOPOK):
224 logger.debug("Broadcast stopped")
225 self._result.set(True)