]> git.parisson.com Git - teleforma.git/commitdiff
Add CBV media streaming and download views
authorGuillaume Pellerin <guillaume.pellerin@ircam.fr>
Thu, 16 Aug 2018 14:23:55 +0000 (16:23 +0200)
committerGuillaume Pellerin <guillaume.pellerin@ircam.fr>
Thu, 16 Aug 2018 14:23:55 +0000 (16:23 +0200)
teleforma/templates/teleforma/course_media.html
teleforma/urls.py
teleforma/views/core.py

index 8eeabde36911104ad7e622a3deca9199368011cb..5b2d326b684e86d9236a0ca5ba383e6a904fa788 100644 (file)
@@ -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' %}
   <div class="module_action">
-   <a href="{{ MEDIA_URL }}{{ media.item.file }}" class="component_icon button" id="action_red"><img src="/static/teleforma/images/download_media.png" alt="" style="vertical-align:middle" />&nbsp;{% trans "Download" %}</a>
+   <a href="{% url 'teleforma-media-download' period.id media.pk %}" class="component_icon button" id="action_red"><img src="/static/teleforma/images/download_media.png" alt="" style="vertical-align:middle" />&nbsp;{% trans "Download" %}</a>
   </div>
  {% endif %}
 {% endif %}
@@ -97,7 +97,7 @@ $(document).ready(function(){
 {% if "video" in media.mime_type %}
 <div class="video">
     <video id="my_video_1" class="video-js vjs-default-skin" width="864" height="480" controls preload="auto" data-setup='{}' {% if media.item.related.all %}{% for related in media.item.related.all %}{% if related.title == "preview" %}{% thumbnail related.file "640" as im %}poster="{{ im.url }}"{% endthumbnail %}{% endif %}{% endfor %}{% endif %}>
-        <source src="{{ MEDIA_URL }}{{ media.item.file }}" type="{{ media.mime_type }}" />
+        <source src="{% url 'teleforma-media-streaming' period.id media.pk %}" type="{{ media.mime_type }}" />
     </video>
 </div>
 
@@ -121,7 +121,7 @@ $(document).ready(function(){
 </div>
 <div class="audio">
     <audio controls preload="auto">
-        <source src="{{ MEDIA_URL }}{{ media.item.file }}" type="{{ media.mime_type }}" />
+        <source src="{% url 'teleforma-media-streaming' period.id media.pk %}" type="{{ media.mime_type }}" />
     </audio>
 </div>
 {% endif %}
index b5eb3748df62e928a6baba01d5247f0a7de3dca1..c9e7aa982b409e35b4b395f2e2ed0a04c153f6ff 100644 (file)
@@ -80,7 +80,8 @@ urlpatterns = patterns('',
 
     url(r'^desk/periods/(?P<period_id>.*)/medias/(?P<pk>.*)/detail/$', MediaView.as_view(), name="teleforma-media-detail"),
     url(r'^desk/periods/(?P<period_id>.*)/medias/(?P<pk>.*)/embed/$', MediaViewEmbed.as_view(), name="teleforma-media-embed"),
-    url(r'^desk/periods/(?P<period_id>.*)/medias/(?P<pk>.*)/download/$', media.download, name="teleforma-media-download"),
+    url(r'^desk/periods/(?P<period_id>.*)/medias/(?P<pk>.*)/download/$', MediaDownloadView.as_view(), name="teleforma-media-download"),
+    url(r'^desk/periods/(?P<period_id>.*)/medias/(?P<pk>.*)/streaming/$', MediaStreamingView.as_view(), name="teleforma-media-streaming"),
 
     url(r'^desk/documents/(?P<pk>.*)/detail/$', DocumentView.as_view(),
         name="teleforma-document-detail"),
index 0864b9c7b9195afcff5923011445f146d2b3577f..bbe00670e89e326bfc2625bf3a6cc8ed0805e8ec 100644 (file)
@@ -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