streaming partial content
unknown
python
2 years ago
2.1 kB
6
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...