plugin.video.torrenter/Proxier.py

81 lines
2.4 KiB
Python

import socket
import thread
import re
import os
class Proxier:
HOST = '127.0.0.1'
PORT = 51515
PATH = ''
CHUNK_SIZE = 1024
seekBytes = 0
buffering = 0
def server(self, path):
self.PATH = path
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.settimeout(600)
s.bind((self.HOST, self.PORT))
s.listen(1)
while True:
conn, addr = s.accept()
conn.setblocking(1)
data = conn.recv(1024)
range = re.compile('Range: bytes=(\d+)-(\d*)')
size = os.path.getsize(self.PATH)
byte1, byte2 = 0, None
if range.search(data):
g = range.search(data).groups()
if g[0]: byte1 = int(g[0])
if g[1]: byte2 = int(g[1])
length = size - byte1
if byte2 is not None:
length = byte2 - byte1
thread.start_new_thread(self.streamer, (conn, byte1, byte2, length, size, ))
def streamer(self, conn, byte1, byte2, length, size):
send = ''
if byte1 > 0 or byte2 != None:
send = send + "HTTP/1.1 206 Partial Content"
send = send + "\r\n"
send = send + "Content-Range: %s-%s/%s" % (str(byte1), str(byte1 + length - 1), str(size))
send = send + "\r\n"
self.seekBytes = byte1
else:
send = send + "HTTP/1.1 200 OK"
send = send + "\r\n"
send = send + "Content-Type: video/mp4"
send = send + "\r\n"
send = send + "Content-Length: " + str(length)
send = send + "\r\n"
send = send + "Accept-Ranges: bytes"
send = send + "\r\n"
send = send + "Connection: close"
send = send + "\r\n"
send = send + "\r\n"
conn.send(send)
fp = open(self.PATH, "rb")
fp.seek(byte1)
sent = 0
while length > sent:
chunk = fp.read(self.CHUNK_SIZE)
if chunk:
self.buffering = 0
try:
sent = sent + conn.send(chunk)
except socket.error, e:
conn.close()
break
else:
self.buffering = self.buffering + 1
time.sleep(1)
if self.buffering > 60:
break
fp.close()
conn.close()