import socket
import sys
class server_socket(socket.socket):
def __init__(self, arg):
if not type(arg)==tuple:
self.socket=arg
else:
self.socket=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
self.socket.bind(arg)
self.socket.listen(1)
def accept(self):
s, addr=self.socket.accept()
return server_socket(s), addr
def readline(self):
"""receive and return a complete line"""
line=""
while 1:
char = self.recv(1)
if not char:
if line=="":
return False
return line
if char=="\n":
return line
if char!="\r":
line += char
def __getattr__(self, name):
return getattr(self.socket, name)
class client_socket(server_socket):
def __init__(self, ip, port):
self.socket=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.socket.connect((ip,port))
class basic_rtsp_socket(client_socket):
def __init__(self, ip, port):
client_socket.__init__(self, ip, port)
self.cseq=1
def request(self, request):
print "\n".join([">>> %s" % x for x in (request % self.cseq).split("\n")])
self.send(request % self.cseq)
self.cseq+=1
l=self.readline()
print "<<< %s" % l
(proto, code)=l.split(" ")[0:2]
if proto[0:4]!="RTSP": raise "Error: not a rtsp response", l
if code!="200": raise "Error: rtsp error", l
l=self.readline()
print "<<< %s" % l
header={}
while l!="" and l!=None:
l2=l.split(": ")
if len(l2)!=2: raise "Incorrect response", l
header[l2[0]]=l2[1]
l=self.readline()
print "<<< %s" % l
if l==None: raise "rtsp connection closed by foreign host", None
data=None
if "Content-length" in header.keys():
data=read(int(header["Content-length"]))
return (header, data)
http_listen=server_socket(("", 8082))
http_conn, addr = http_listen.accept()
print 'Connected by', addr
data = http_conn.readline()
if not data: raise "no data on http line", None
(request, url, proto)=data.split(" ")[0:3]
if request!="GET":
raise "Error : not a get request", data
if proto[0:4]!="HTTP":
raise "Error : not a http request", data
l=http_conn.readline()
print "<<< %s" %l
while l!="" and l!=None:
l=http_conn.readline()
print "<<< %s" % l
if l==None: raise "http connection closed", None
http_conn.send("""HTTP/1.0 200 OK
Content-type: application/octet-stream
Cache-Control: no-cache
""")
rtsp_session=basic_rtsp_socket("mafreebox.freebox.fr", 554)
print "connected to the rtsp session"
(header, data)=rtsp_session.request("""OPTIONS rtsp://mafreebox.freebox.fr/freeboxtv%s RTSP/1.0
CSeq: %s
User-Agent: rtsp2http v0.0.1
""" % (url, "%d"))
(header, data)=rtsp_session.request("""SETUP rtsp://212.27.38.253/freeboxtv%s RTSP/1.0
CSeq: %s
Transport: RTP/AVP;unicast;client_port=1662-1663
User-Agent: rtsp2http v0.0.1
""" % (url, "%d"))
session=header["Session"]
rtsp_data = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
rtsp_data.bind(("", 1662))
(header, data)=rtsp_session.request("""PLAY rtsp://mafreebox.freebox.fr/freeboxtv%s RTSP/1.0
CSeq: %s
Session: %s
Range: npt=0.000-
User-Agent: rtsp2http v0.0.1
""" % (url, "%d", session))
ok=True
while ok:
data, addr=rtsp_data.recvfrom(2048)
if addr[0]==socket.gethostbyname("mafreebox.freebox.fr"):
try:
http_conn.sendall(data[12:])
except:
ok=False
rtsp_session.request("""TEARDOWN rtsp://mafreebox.freebox.fr/freeboxtv%s RTSP/1.0
CSeq: %s
Session: %s
User-Agent: rtsp2http v0.0.1
""" % (url, "%d", session))
rtsp_session.close()
rtsp_data.close()
http_listen.close()
http_conn.close()