Сделана корректная обработка "неаккуратных" файлов с пропущенными кавычками вокруг...
[vpproxy.git] / vphttp.py
index 5670965c84638b5c31807658631677c132ec3c01..0c09c5297bb8e040d32460a1201c517f473544ac 100644 (file)
--- a/vphttp.py
+++ b/vphttp.py
@@ -9,8 +9,9 @@ import traceback
 import gevent
 import gevent.monkey
 # Monkeypatching and all the stuff
 import gevent
 import gevent.monkey
 # Monkeypatching and all the stuff
-
 gevent.monkey.patch_all()
 gevent.monkey.patch_all()
+# Startup delay for daemon restart
+gevent.sleep(5)
 import glob
 import os
 import signal
 import glob
 import os
 import signal
@@ -26,6 +27,7 @@ import hashlib
 import vpconfig
 from vpconfig import VPConfig
 import vlcclient
 import vpconfig
 from vpconfig import VPConfig
 import vlcclient
+import gc
 import plugins.modules.ipaddr as ipaddr
 from clientcounter import ClientCounter
 from plugins.modules.PluginInterface import VPProxyPlugin
 import plugins.modules.ipaddr as ipaddr
 from clientcounter import ClientCounter
 from plugins.modules.PluginInterface import VPProxyPlugin
@@ -163,7 +165,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
             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') 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:
                 self.dieWithError(400)  # 400 Bad Request
                 return
         except IndexError:
@@ -186,7 +188,6 @@ class HTTPHandler(BaseHTTPServer.BaseHTTPRequestHandler):
     def handleRequest(self, headers_only):
 
         # Limit concurrent connections
     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
         if 0 < VPConfig.maxconns <= VPStuff.clientcounter.total:
             logger.debug("Maximum connections reached, can't serve this")
             self.dieWithError(503)  # 503 Service Unavailable
@@ -235,7 +236,12 @@ class HTTPHandler(BaseHTTPServer.BaseHTTPRequestHandler):
             logger.debug(
                 "Sending fake headers for " + useragent)
             self.send_response(200)
             logger.debug(
                 "Sending fake headers for " + useragent)
             self.send_response(200)
-            self.send_header("Content-Type", "video/mpeg")
+            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")
             self.end_headers()
             # Do not send real headers at all
             self.headerssent = True
             self.end_headers()
             # Do not send real headers at all
             self.headerssent = True
@@ -256,7 +262,7 @@ class HTTPHandler(BaseHTTPServer.BaseHTTPRequestHandler):
                 else:
                     self.vlcprefix = ''
 
                 else:
                     self.vlcprefix = ''
 
-                logger.debug("Ready to start broadcast....")                    
+                logger.info("Starting broadcasting "+self.path)                    
                 VPStuff.vlcclient.startBroadcast(
                     self.vlcid, self.vlcprefix + self.path_unquoted, VPConfig.vlcmux, VPConfig.vlcpreaccess, self.reqtype)
                 # Sleep a bit, because sometimes VLC doesn't open port in
                 VPStuff.vlcclient.startBroadcast(
                     self.vlcid, self.vlcprefix + self.path_unquoted, VPConfig.vlcmux, VPConfig.vlcpreaccess, self.reqtype)
                 # Sleep a bit, because sometimes VLC doesn't open port in
@@ -284,11 +290,22 @@ 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']
                     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.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])
+
+                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")
+                else:
+                    self.send_header("Content-Type", "video/mpeg")
+
                 # End headers. Next goes video data
                 self.end_headers()
                 logger.debug("Headers sent")
                 # End headers. Next goes video data
                 self.end_headers()
                 logger.debug("Headers sent")
@@ -314,15 +331,21 @@ class HTTPHandler(BaseHTTPServer.BaseHTTPRequestHandler):
             self.dieWithError()
         finally:
             logger.debug("END REQUEST")
             self.dieWithError()
         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")
             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()
                     VPStuff.vlcclient.stopBroadcast(self.vlcid)
                 except:
                     pass
                 self.vp.destroy()
-
+            if not self.headerssent:
+                logger.error("Problem receiving video stream, no headers!")
+                if VPStuff.clientcounter.total == 0:
+                    logger.error("Probably VLC hang")
+                    VPStuff.vlc.kill()
 
 class HTTPServer(SocketServer.ThreadingMixIn, BaseHTTPServer.HTTPServer):
 
 
 class HTTPServer(SocketServer.ThreadingMixIn, BaseHTTPServer.HTTPServer):
 
@@ -389,6 +412,7 @@ for i in pluginslist:
         continue
     logger.debug('Plugin loaded: ' + plugname)
     for j in plugininstance.handlers:
         continue
     logger.debug('Plugin loaded: ' + plugname)
     for j in plugininstance.handlers:
+        logger.info("Registering handler '" + j +"'")
         VPStuff.pluginshandlers[j] = plugininstance
     VPStuff.pluginlist.append(plugininstance)
 
         VPStuff.pluginshandlers[j] = plugininstance
     VPStuff.pluginlist.append(plugininstance)