X-Git-Url: https://git.rvb.name/vpproxy.git/blobdiff_plain/1e2c0e679beb33f10c2e551768c17ccd77576b54..21abfc4eb5f6f49ef263d0c1961fb1dff19f337c:/vphttp.py diff --git a/vphttp.py b/vphttp.py index 9046563..d5f9018 100644 --- a/vphttp.py +++ b/vphttp.py @@ -9,8 +9,9 @@ import traceback import gevent import gevent.monkey # Monkeypatching and all the stuff - gevent.monkey.patch_all() +# Startup delay for daemon restart +gevent.sleep(5) import glob import os import signal @@ -163,7 +164,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=='get' or self.reqtype in VPStuff.pluginshandlers): + if not (self.reqtype in ('get','mp4','ogg') or self.reqtype in VPStuff.pluginshandlers): self.dieWithError(400) # 400 Bad Request return except IndexError: @@ -186,6 +187,7 @@ class HTTPHandler(BaseHTTPServer.BaseHTTPRequestHandler): def handleRequest(self, headers_only): # Limit concurrent connections + print VPStuff.clientcounter.total if 0 < VPConfig.maxconns <= VPStuff.clientcounter.total: logger.debug("Maximum connections reached, can't serve this") self.dieWithError(503) # 503 Service Unavailable @@ -193,6 +195,7 @@ class HTTPHandler(BaseHTTPServer.BaseHTTPRequestHandler): # Pretend to work fine with Fake UAs or HEAD request. useragent = self.headers.get('User-Agent') + logger.debug("HTTP User Agent:"+useragent) fakeua = useragent and useragent in VPConfig.fakeuas if headers_only or fakeua: if fakeua: @@ -214,26 +217,29 @@ class HTTPHandler(BaseHTTPServer.BaseHTTPRequestHandler): self.params.append('0') # Adding client to clientcounter - clients = VPStuff.clientcounter.add(self.path_unquoted, self.clientip) + clients = VPStuff.clientcounter.add(self.reqtype+'\\'+self.path_unquoted, self.clientip) # If we are the one client, but sucessfully got vp instance from clientcounter, # then somebody is waiting in the videodestroydelay state # Check if we are first client - if VPStuff.clientcounter.get(self.path_unquoted)==1: + 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.path_unquoted).hexdigest() + self.vlcid = hashlib.md5(self.reqtype+'\\'+self.path_unquoted).hexdigest() # Send fake headers if this User-Agent is in fakeheaderuas tuple if fakeua: logger.debug( "Sending fake headers for " + useragent) self.send_response(200) - self.send_header("Content-Type", "video/mpeg") + if self.reqtype=="ogg": + self.send_header("Content-Type", "video/ogg") + else: + self.send_header("Content-Type", "video/mpeg") self.end_headers() # Do not send real headers at all self.headerssent = True @@ -243,12 +249,9 @@ class HTTPHandler(BaseHTTPServer.BaseHTTPRequestHandler): logger.debug("hangDetector spawned") gevent.sleep() - # Initializing VPClient - # Getting URL self.errorhappened = False - print shouldcreatevp if shouldcreatevp: logger.debug("Got url " + self.path_unquoted) # Force ffmpeg demuxing if set in config @@ -257,8 +260,9 @@ class HTTPHandler(BaseHTTPServer.BaseHTTPRequestHandler): else: self.vlcprefix = '' + logger.info("Starting broadcasting "+self.path) VPStuff.vlcclient.startBroadcast( - self.vlcid, self.vlcprefix + self.path_unquoted, VPConfig.vlcmux, VPConfig.vlcpreaccess) + self.vlcid, self.vlcprefix + self.path_unquoted, VPConfig.vlcmux, VPConfig.vlcpreaccess, self.reqtype) # Sleep a bit, because sometimes VLC doesn't open port in # time gevent.sleep(0.5) @@ -284,11 +288,19 @@ class HTTPHandler(BaseHTTPServer.BaseHTTPRequestHandler): del self.video.info().dict['server'] if self.video.info().dict.has_key('transfer-encoding'): del self.video.info().dict['transfer-encoding'] + if self.video.info().dict.has_key('content-type'): + del self.video.info().dict['content-type'] if self.video.info().dict.has_key('keep-alive'): del self.video.info().dict['keep-alive'] for key in self.video.info().dict: self.send_header(key, self.video.info().dict[key]) + + if self.reqtype=="ogg": + self.send_header("Content-Type", "video/ogg") + else: + self.send_header("Content-Type", "video/mpeg") + # End headers. Next goes video data self.end_headers() logger.debug("Headers sent") @@ -311,14 +323,15 @@ class HTTPHandler(BaseHTTPServer.BaseHTTPRequestHandler): # Unknown exception logger.error(traceback.format_exc()) self.errorhappened = True - raise self.dieWithError() finally: logger.debug("END REQUEST") - VPStuff.clientcounter.delete(self.path_unquoted, self.clientip) - if not VPStuff.clientcounter.get(self.path_unquoted): + 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 @@ -417,7 +430,7 @@ DEVNULL = open(os.devnull, 'wb') # Spawning procedures def spawnVLC(cmd, delay = 0): try: - VPStuff.vlc = psutil.Popen(cmd, stdout=DEVNULL, stderr=DEVNULL) + VPStuff.vlc = psutil.Popen(cmd) #, stdout=DEVNULL, stderr=DEVNULL) gevent.sleep(delay) return True except: @@ -430,7 +443,6 @@ def connectVLC(): out_port=VPConfig.vlcoutport) return True except vlcclient.VlcException as e: - print repr(e) return False def isRunning(process):