X-Git-Url: https://git.rvb.name/vpproxy.git/blobdiff_plain/8960711387d2b34c7f8b8d8a0cc036e52c6c6f06..1aebc74d991c35b7eb82395434d543d44f536089:/vphttp.py diff --git a/vphttp.py b/vphttp.py index 0a6ae43..7ed52f7 100644 --- a/vphttp.py +++ b/vphttp.py @@ -37,7 +37,9 @@ try: except ImportError: pass +import uuid +from apscheduler.schedulers.background import BackgroundScheduler class HTTPHandler(BaseHTTPServer.BaseHTTPRequestHandler): @@ -86,11 +88,12 @@ class HTTPHandler(BaseHTTPServer.BaseHTTPRequestHandler): try: while True: - + if not self.clientconnected: logger.debug("Client is not connected, terminating") break + VPStuff.vlcclient.mark(self.vlcid) data = self.video.read(4096) if data and self.clientconnected: self.wfile.write(data) @@ -165,7 +168,7 @@ class HTTPHandler(BaseHTTPServer.BaseHTTPRequestHandler): self.reqtype = self.splittedpath[1].lower() # If first parameter is 'pid' or 'torrent' or it should be handled # by plugin - if not (self.reqtype in ('get','mp4','ogg') or self.reqtype in VPStuff.pluginshandlers): + if not (self.reqtype in ('get','mp4','ogg','ogv') or self.reqtype in VPStuff.pluginshandlers): self.dieWithError(400) # 400 Bad Request return except IndexError: @@ -186,6 +189,8 @@ class HTTPHandler(BaseHTTPServer.BaseHTTPRequestHandler): self.handleRequest(headers_only) def handleRequest(self, headers_only): + + self.unic = uuid.uuid4() # Limit concurrent connections if 0 < VPConfig.maxconns <= VPStuff.clientcounter.total: @@ -217,7 +222,7 @@ class HTTPHandler(BaseHTTPServer.BaseHTTPRequestHandler): self.params.append('0') # Adding client to clientcounter - clients = VPStuff.clientcounter.add(self.reqtype+'\\'+self.path_unquoted, self.clientip) + clients = VPStuff.clientcounter.add(self.reqtype+'\\'+self.path_unquoted, self.clientip, self.unic) # If we are the one client, but sucessfully got vp instance from clientcounter, # then somebody is waiting in the videodestroydelay state @@ -236,8 +241,9 @@ class HTTPHandler(BaseHTTPServer.BaseHTTPRequestHandler): logger.debug( "Sending fake headers for " + useragent) self.send_response(200) - self.send_header('Cache-Control','no-cache'); - if self.reqtype=="ogg": + self.send_header('Cache-Control','no-cache, no-store, must-revalidate'); + self.send_header('Pragma','no-cache'); + if self.reqtype in ("ogg","ogv"): self.send_header("Content-Type", "video/ogg") else: self.send_header("Content-Type", "video/mpeg") @@ -297,7 +303,8 @@ class HTTPHandler(BaseHTTPServer.BaseHTTPRequestHandler): for key in self.video.info().dict: self.send_header(key, self.video.info().dict[key]) - self.send_header('Cache-Control','no-cache'); + self.send_header('Cache-Control','no-cache, no-store, must-revalidate'); + self.send_header('Pragma','no-cache'); if self.reqtype=="ogg": self.send_header("Content-Type", "video/ogg") @@ -307,6 +314,7 @@ class HTTPHandler(BaseHTTPServer.BaseHTTPRequestHandler): # End headers. Next goes video data self.end_headers() logger.debug("Headers sent") + self.headerssent = True # Run proxyReadWrite self.proxyReadWrite() @@ -330,20 +338,20 @@ class HTTPHandler(BaseHTTPServer.BaseHTTPRequestHandler): finally: logger.debug("END REQUEST") logger.info("Closed connection from " + self.clientip + " path " + self.path) - VPStuff.clientcounter.delete(self.reqtype+'\\'+self.path_unquoted, self.clientip) - if not VPStuff.clientcounter.get(self.reqtype+'\\'+self.path_unquoted): - try: - logger.debug("That was the last client, destroying VPClient") - logger.info("Stopping broadcasting " + self.path) - VPStuff.vlcclient.stopBroadcast(self.vlcid) - except: - pass - self.vp.destroy() - if not self.headersent: - logger.error("Problem receiving video stream, no headers!") - if VPStuff.clientcounter.total == 0: - logger.error("Probably VLC hang") - VPStuff.vlc.kill() + VPStuff.clientcounter.delete(self.reqtype+'\\'+self.path_unquoted, self.clientip, self.unic) +# if not VPStuff.clientcounter.get(self.reqtype+'\\'+self.path_unquoted): +# try: +# logger.debug("That was the last client, destroying VPClient") +# logger.info("Stopping broadcasting " + self.path) +# VPStuff.vlcclient.stopBroadcast(self.vlcid) +# except vlcclient.VlcException: +# logger.error("VLC connection problem, %s client(s)!" % VPStuff.clientcounter.total) +# if VPStuff.clientcounter.total == 0: +# logger.error("Probably VLC hang") +# VPStuff.vlc.kill() +# except: +# pass + self.vp.destroy() class HTTPServer(SocketServer.ThreadingMixIn, BaseHTTPServer.HTTPServer): @@ -513,6 +521,14 @@ def _reloadconfig(signum=None, frame=None): from vpconfig import VPConfig logger.info('Config reloaded') +sched = BackgroundScheduler() +sched.start() + +def clean_streams(): + VPStuff.vlcclient.clean_streams(15) + +job = sched.add_job(clean_streams, 'interval', seconds=15) + # setting signal handlers try: gevent.signal(signal.SIGHUP, _reloadconfig) @@ -531,7 +547,7 @@ else: try: logger.info("Using gevent %s" % gevent.__version__) - logger.info("Using psutil %s" % psutil.__version__) + logger.info("Usig psutil %s" % psutil.__version__) logger.info("Using VLC %s" % VPStuff.vlcclient._vlcver) logger.info("Server started.") while True: