From a1191474e9872d405324b7e0d203d7fae7ef7d7e Mon Sep 17 00:00:00 2001 From: Guillaume Pellerin Date: Thu, 16 Aug 2018 15:32:12 +0200 Subject: [PATCH] Add nginx X-Accel media access functions --- teleforma/views/core.py | 39 ++++++++++++++++++++++++++++++++++++--- 1 file changed, 36 insertions(+), 3 deletions(-) diff --git a/teleforma/views/core.py b/teleforma/views/core.py index 9eab21f6..1f2e9256 100644 --- a/teleforma/views/core.py +++ b/teleforma/views/core.py @@ -1,5 +1,6 @@ # -*- coding: utf-8 -*- -# Copyright (c) 2011-2013 Parisson SARL +# Copyright (c) 2011-2018 Parisson SARL +# Copyright (c) 2011-2018 Guillaume Pellerin # This software is a computer program whose purpose is to backup, analyse, # transcode and stream any audio content with its metadata over a web frontend. @@ -45,8 +46,7 @@ from django.utils.decorators import method_decorator from django.contrib.auth import authenticate, login, get_backends from django.template import RequestContext, loader from django import template -from django.http import HttpResponse, HttpResponseRedirect -from django.http import Http404 +from django.http import HttpResponse, HttpResponseRedirect, FileResponse, Http404 from django.shortcuts import render_to_response, redirect, get_object_or_404 from django.views.generic import * from django.views.generic.base import * @@ -170,6 +170,39 @@ def get_periods(user): return periods +def serve_media(media_path, content_type="", buffering=True, streaming=False): + if not settings.DEBUG: + return nginx_media_accel(media_path, content_type=content_type, + buffering=buffering, streaming=streaming) + else: + try: + response = FileResponse(open(media_path, 'rb')) + except: + response = StreamingHttpResponse(stream_from_file(media_path), content_type=content_type) + filename = os.path.basename(media_path) + if not streaming: + response['Content-Disposition'] = 'attachment; ' + 'filename=' + filename + return response + + +def nginx_media_accel(media_path, content_type="", buffering=True, streaming=False): + """Send a protected media file through nginx with X-Accel-Redirect""" + + response = HttpResponse() + url = settings.MEDIA_URL + os.path.relpath(media_path, settings.MEDIA_ROOT) + filename = os.path.basename(media_path) + if not streaming: + response['Content-Disposition'] = "attachment; filename=%s" % (filename) + response['Content-Type'] = content_type + response['X-Accel-Redirect'] = url + + if not buffering: + response['X-Accel-Buffering'] = 'no' + #response['X-Accel-Limit-Rate'] = 524288 + + return response + + class HomeRedirectView(View): def get(self, request): -- 2.39.5