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
Я надавил на это, и, похоже, это работает как жизнеспособная замена.
Есть ли у кого-нибудь предложения по улучшению?