streaming partial content
unknown
python
3 years ago
2.1 kB
9
Indexable
# -*- coding: utf-8 -*-
import six
from flask import Flask, Response, request
import sys
import os
import re
import requests
import base64
PORT = 80
app = Flask(__name__, static_url_path='/static')
def serve_forever():
app.run(host='0.0.0.0', port=PORT)
@app.route('/stream')
def stream():
mime = "video/mp4"
h = {'User-Agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Mobile Safari/537.36'}
url = 'http://site.com/video.mp4'
if url:
range_header = request.headers.get('Range', None)
def generate_data_from_response(resp, chunk=4095):
for data_chunk in resp.iter_content(chunk_size=chunk):
yield data_chunk
def serve_partial(url, range_header, mime, size=3145728):
if range_header:
status = 206
from_bytes, until_bytes = range_header.replace('bytes=', '').split('-')
if not until_bytes:
until_bytes = int(from_bytes) + size # Default size is 3MB
h.update({'Range': 'bytes=%s-%s' % (from_bytes, until_bytes)})
else:
status = 200
headers = h
r = requests.get(url, headers=headers, stream=True)
rv = Response(generate_data_from_response(r), status, mimetype=mime,direct_passthrough=True)
rv.headers.add('Content-Range', r.headers.get('Content-Range'))
rv.headers.add('Content-Length', r.headers['Content-Length'])
return rv
return serve_partial(url, range_header, mime, size=3145728)
else:
return ''
@app.route('/')
def index():
return 'Flask Server'
@app.after_request
def after_request(response):
response.headers.add('Accept-Ranges', 'bytes')
return response
# @app.route('/<path:path>')
# def send_file(path):
# return send_from_directory('static', path)
if __name__ == '__main__':
serve_forever()
Editor is loading...