From: Guillaume Pellerin Date: Thu, 16 Aug 2018 14:23:55 +0000 (+0200) Subject: Add CBV media streaming and download views X-Git-Tag: 1.3.1~9 X-Git-Url: https://git.parisson.com/?a=commitdiff_plain;h=5cb67ab2fb254a32d736709c29c05028705d4bca;p=teleforma.git Add CBV media streaming and download views --- diff --git a/teleforma/templates/teleforma/course_media.html b/teleforma/templates/teleforma/course_media.html index 8eeabde3..5b2d326b 100644 --- a/teleforma/templates/teleforma/course_media.html +++ b/teleforma/templates/teleforma/course_media.html @@ -61,7 +61,7 @@ $(document).ready(function(){ {% if media.item.file and media.is_published or user.is_superuser or user.is_staff %} {% if not "video" in media.mime_type or perms.telemeta.can_play_all_items or request.user_agent.os.family == 'iOS' %}
-  {% trans "Download" %} +  {% trans "Download" %}
{% endif %} {% endif %} @@ -97,7 +97,7 @@ $(document).ready(function(){ {% if "video" in media.mime_type %}
@@ -121,7 +121,7 @@ $(document).ready(function(){
{% endif %} diff --git a/teleforma/urls.py b/teleforma/urls.py index b5eb3748..c9e7aa98 100644 --- a/teleforma/urls.py +++ b/teleforma/urls.py @@ -80,7 +80,8 @@ urlpatterns = patterns('', url(r'^desk/periods/(?P.*)/medias/(?P.*)/detail/$', MediaView.as_view(), name="teleforma-media-detail"), url(r'^desk/periods/(?P.*)/medias/(?P.*)/embed/$', MediaViewEmbed.as_view(), name="teleforma-media-embed"), - url(r'^desk/periods/(?P.*)/medias/(?P.*)/download/$', media.download, name="teleforma-media-download"), + url(r'^desk/periods/(?P.*)/medias/(?P.*)/download/$', MediaDownloadView.as_view(), name="teleforma-media-download"), + url(r'^desk/periods/(?P.*)/medias/(?P.*)/streaming/$', MediaStreamingView.as_view(), name="teleforma-media-streaming"), url(r'^desk/documents/(?P.*)/detail/$', DocumentView.as_view(), name="teleforma-document-detail"), diff --git a/teleforma/views/core.py b/teleforma/views/core.py index 0864b9c7..bbe00670 100644 --- a/teleforma/views/core.py +++ b/teleforma/views/core.py @@ -46,7 +46,8 @@ from django.utils.decorators import method_decorator from django.contrib.auth import authenticate, login, get_backends from django.template import RequestContext, loader, Context from django import template -from django.http import HttpResponse, HttpResponseRedirect, FileResponse, Http404 +from django.http import HttpResponse, HttpResponseRedirect +from django.http import Http404 from django.shortcuts import render_to_response, redirect, get_object_or_404 from django.views.generic import * from django.views.generic.base import * @@ -237,14 +238,14 @@ def render_to_pdf(request, template, context, filename=None, encoding='utf-8', def serve_media(media_path, content_type="", buffering=True, streaming=False): + if not content_type: + content_type = mimetypes.guess_type(media_path)[0] + 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) + 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 @@ -455,28 +456,6 @@ class MediaView(CourseAccessMixin, DetailView): def dispatch(self, *args, **kwargs): return super(MediaView, self).dispatch(*args, **kwargs) - def download(self, request, pk): - courses = get_courses(request.user) - media = Media.objects.get(id=pk) - if get_access(media, courses): - path = media.item.file.path - filename, ext = os.path.splitext(path) - filename = filename.split(os.sep)[-1] - fsock = open(media.item.file.path, 'r') - view = ItemView() - mimetype = view.item_analyze(media.item) - extension = mimetypes.guess_extension(mimetype) - if not extension: - extension = ext - response = HttpResponse(fsock, mimetype=mimetype) - - response['Content-Disposition'] = "attachment; filename=%s%s" % \ - (filename.encode('utf8'), extension) - return response - else: - return redirect('teleforma-media-detail', self.context['period'].id, media.id) - - @jsonrpc_method('teleforma.publish_media') def publish(request, id): media = Media.objects.get(id=id) @@ -490,6 +469,25 @@ class MediaView(CourseAccessMixin, DetailView): media.save() +class MediaStreamingView(MediaView): + + streaming = True + + def get(self): + courses = get_courses(self.request.user) + media = Media.objects.get(id=self.kwargs['pk']) + if get_access(media, courses): + media_path = media.item.file.path + return serve_media(media_path, streaming=streaming) + else: + return redirect('teleforma-media-detail', self.context['period'].id, media.id) + + +class MediaDownloadView(MediaStreamingView): + + streaming = False + + class MediaPendingView(ListView): model = Media