video-with-range.py (1547B)
1 import re 2 import os 3 import json 4 from wptserve.utils import isomorphic_decode 5 6 def main(request, response): 7 path = os.path.join(request.doc_root, u"media", "sine440.mp3") 8 total_size = os.path.getsize(path) 9 rewrites = json.loads(request.GET.first(b'rewrites', '[]')) 10 range_header = request.headers.get(b'Range') 11 range_header_match = range_header and re.search(r'^bytes=(\d*)-(\d*)$', isomorphic_decode(range_header)) 12 start = None 13 end = None 14 if range_header_match: 15 response.status = 206 16 start, end = range_header_match.groups() 17 if range_header: 18 status = 206 19 else: 20 status = 200 21 for rewrite in rewrites: 22 req_start, req_end = rewrite['request'] 23 if start == req_start or req_start == '*': 24 if end == req_end or req_end == '*': 25 if 'response' in rewrite: 26 start, end = rewrite['response'] 27 if 'status' in rewrite: 28 status = rewrite['status'] 29 30 start = int(start or 0) 31 end = int(end or total_size) 32 headers = [] 33 if status == 206: 34 headers.append((b"Content-Range", b"bytes %d-%d/%d" % (start, end - 1, total_size))) 35 headers.append((b"Accept-Ranges", b"bytes")) 36 37 headers.append((b"Content-Type", b"audio/mp3")) 38 headers.append((b"Content-Length", str(end - start))) 39 headers.append((b"Cache-Control", b"no-cache")) 40 video_file = open(path, "rb") 41 video_file.seek(start) 42 content = video_file.read(end) 43 return status, headers, content