streaming partial content

 avatar
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...