# then somebody is waiting in the videodestroydelay state
# Check if we are first client
- if VPStuff.clientcounter.get(self.reqtype+'/'+self.path_unquoted)==1:
- logger.debug("First client, should create VLC session")
- shouldcreatevp = True
- else:
- logger.debug("Can reuse existing session")
- shouldcreatevp = False
self.vlcid = hashlib.md5(self.reqtype+'/'+self.path_unquoted).hexdigest()
+ try:
+ if not VPStuff.vlcclient.check_stream(self.vlcid):
+ logger.debug("First client, should create VLC session")
+ shouldcreatevp = True
+ else:
+ logger.debug("Can reuse existing session")
+ shouldcreatevp = False
+ except Exception as e:
+ logger.error('Plugin exception: ' + repr(e))
+ logger.error(traceback.format_exc())
+ self.dieWithError()
+
# Send fake headers if this User-Agent is in fakeheaderuas tuple
if fakeua:
logger.debug(
# Waiting until hangDetector is joined
self.hanggreenlet.join()
logger.debug("Request handler finished")
-
+ except (vlcclient.VlcException) as e:
+ logger.error("Exception: " + repr(e))
+ VPStuff.vlcerrors = VPStuff.vlcerrors + 1
+ logger.error("%s error(s) communicating VLC")
+ self.errorhappened = True
+ self.dieWithError()
except (vpclient.VPException, vlcclient.VlcException, urllib2.URLError) as e:
logger.error("Exception: " + repr(e))
self.errorhappened = True
Inter-class interaction class
'''
vlcclient=None
+ vlcerrors=0
# taken from http://stackoverflow.com/questions/2699907/dropping-root-permissions-in-python
def drop_privileges(uid_name, gid_name='nogroup'):
def spawnVLC(cmd, delay = 0):
try:
VPStuff.vlc = psutil.Popen(cmd) #, stdout=DEVNULL, stderr=DEVNULL)
+ VPStuff.vlcerrors = 0
gevent.sleep(delay)
return True
except:
gevent.sleep(1)
if isRunning(VPStuff.vlc):
# or not :)
- VPStuff.vlc.kill()
+ VPStuff.vlc.terminate()
+ gevent.sleep(1)
+ if isRunning(VPStuff.vlc):
+ VPStuff.vlc.kill()
+ del VPStuff.vlc
+
+def restartVLC(cmd, delay = 0):
+ clean_proc()
+ if spawnVLC(cmd, delay):
+ if connectVLC():
+ return True
+ return False
# This is what we call to stop the server completely
def shutdown(signum = 0, frame = 0):
sched.start()
def clean_streams():
- VPStuff.vlcclient.clean_streams(VPConfig.videodestroydelay)
+ if VPStuff.vlcclient:
+ VPStuff.vlcclient.clean_streams(VPConfig.videodestroydelay)
job = sched.add_job(clean_streams, 'interval', seconds=15)
logger.info("Using VLC %s" % VPStuff.vlcclient._vlcver)
logger.info("Server started.")
while True:
+
if not isRunning(VPStuff.vlc):
+
del VPStuff.vlc
if spawnVLC(VPStuff.vlcProc, VPConfig.vlcspawntimeout) and connectVLC():
logger.info("VLC died, respawned it with pid " + str(VPStuff.vlc.pid))
logger.error("Cannot spawn VLC!")
clean_proc()
sys.exit(1)
+
# Return to our server tasks
server.handle_request()
+
+ if VPStuff.vlcerrors>5:
+ if restartVLC(VPStuff.vlcProc, VPConfig.vlcspawntimeout):
+ logger.info("VLC hung, respawned it with pid " + str(VPStuff.vlc.pid))
+ else:
+ logger.error("Cannot spawn VLC!")
+ clean_proc()
+ sys.exit(1)
+
except (KeyboardInterrupt, SystemExit):
sched.shutdown()
shutdown()