projects
/
vpproxy.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Добавлен поток ogg без ограничения скорости (префикс /ogv и /m3uo для списка).
[vpproxy.git]
/
vphttp.py
diff --git
a/vphttp.py
b/vphttp.py
index 904656368a089d160b6524b3c09521fcdcbbc3e4..155db57e8a739b03e35927112d76df419053c83d 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
=='get'
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:
@@
-193,6
+195,7
@@
class HTTPHandler(BaseHTTPServer.BaseHTTPRequestHandler):
# Pretend to work fine with Fake UAs or HEAD request.
useragent = self.headers.get('User-Agent')
# 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:
fakeua = useragent and useragent in VPConfig.fakeuas
if headers_only or fakeua:
if fakeua:
@@
-214,26
+217,30
@@
class HTTPHandler(BaseHTTPServer.BaseHTTPRequestHandler):
self.params.append('0')
# Adding client to clientcounter
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 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
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)
# 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")
+ self.send_header('Cache-Control','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
@@
-243,12
+250,9
@@
class HTTPHandler(BaseHTTPServer.BaseHTTPRequestHandler):
logger.debug("hangDetector spawned")
gevent.sleep()
logger.debug("hangDetector spawned")
gevent.sleep()
- # Initializing VPClient
-
# Getting URL
self.errorhappened = False
# Getting URL
self.errorhappened = False
- print shouldcreatevp
if shouldcreatevp:
logger.debug("Got url " + self.path_unquoted)
# Force ffmpeg demuxing if set in config
if shouldcreatevp:
logger.debug("Got url " + self.path_unquoted)
# Force ffmpeg demuxing if set in config
@@
-257,8
+261,9
@@
class HTTPHandler(BaseHTTPServer.BaseHTTPRequestHandler):
else:
self.vlcprefix = ''
else:
self.vlcprefix = ''
+ logger.info("Starting broadcasting "+self.path)
VPStuff.vlcclient.startBroadcast(
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)
# Sleep a bit, because sometimes VLC doesn't open port in
# time
gevent.sleep(0.5)
@@
-284,11
+289,21
@@
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');
+
+ 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")
@@
-311,19
+326,24
@@
class HTTPHandler(BaseHTTPServer.BaseHTTPRequestHandler):
# Unknown exception
logger.error(traceback.format_exc())
self.errorhappened = True
# Unknown exception
logger.error(traceback.format_exc())
self.errorhappened = True
- raise
self.dieWithError()
finally:
logger.debug("END REQUEST")
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")
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.headersent:
+ 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):
@@
-390,6
+410,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)
@@
-417,7
+438,7
@@
DEVNULL = open(os.devnull, 'wb')
# Spawning procedures
def spawnVLC(cmd, delay = 0):
try:
# 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:
gevent.sleep(delay)
return True
except:
@@
-430,7
+451,6
@@
def connectVLC():
out_port=VPConfig.vlcoutport)
return True
except vlcclient.VlcException as e:
out_port=VPConfig.vlcoutport)
return True
except vlcclient.VlcException as e:
- print repr(e)
return False
def isRunning(process):
return False
def isRunning(process):