Django Потоковое видео / аудио - rangedfilerresponse

Народ,

Целую вечность я использовал RangedFileResponse для включения потоковой передачи (особенно в Safari), но для того, чтобы разрешить потоковую передачу в диапазоне с помощью Django. (Пожалуйста, обратите внимание, что он был довольно сильно раздвоен, тот, который я использовал, взят из https://github.com/devmonkey22/django-ranged-fileresponse.

Мне всегда было интересно, есть ли более современный способ сделать это, поскольку, похоже, лучшего ответа не существует?

Я совсем недавно начал более полно использовать расширения django и наткнулся на расширения Werkzeug (из Django-Extensions), когда включил SSL для среды разработки.

Но я также обнаружил, что Werkzeug может помочь с ответом на ранжированный файл.

Вот что я придумал, и это кажется быстрее, чем использовать django-ranged-fileresponse. Иногда значительно быстрее.


from werkzeug.http import parse_range_header
from django.http import FileResponse, HttpResponseNotAllowed, HttpResponseBadRequest


def stream_video(request, fqpn, content_type="video/mp4"):

    file_size = os.path.getsize(fqpn)
    if request.method != 'GET':
        return HttpResponseNotAllowed(['GET'])

    if request.is_secure():
        range_header = request.META.get('HTTPS_RANGE')
    else:
        range_header = request.META.get('HTTP_RANGE')

    ranges = parse_range_header(range_header)
    if not ranges:
        return FileResponse(open(fqpn, 'rb'))
    
    # For simplicity, handle only single range requests
    start, end = ranges[0]
    with open(fqpn, 'rb') as file_to_send:
        file_to_send.seek(start)
        data = file_to_send.read(end - start + 1)

    response = FileResponse(data, content_type='application/octet-stream')
    response['Content-Length'] = len(data)
    response['Content-Range'] = f'bytes {start}-{end}/{file_size}'
    response['Accept-Ranges'] = 'bytes'
    response.status_code = 206  # Partial Content
    return response

Я надавил на это, и, похоже, это работает как жизнеспособная замена.

Есть ли у кого-нибудь предложения по улучшению?

Вернуться на верх