Use StreamingIterator to avoid loading the whole movie file.
[audio.git] / src / archive / views.py
index b5850a0..62a1216 100644 (file)
@@ -1,14 +1,11 @@
-# Create your views here.
-
 from datetime import datetime
 import os
 import os.path
 from datetime import datetime
 import os
 import os.path
-from urllib import quote
+from urllib.parse import quote
 
 from archive import settings
 
 from archive import settings
-from django.contrib.auth import logout
 from django.contrib.auth.decorators import permission_required
 from django.contrib.auth.decorators import permission_required
-from django.core.urlresolvers import reverse
+from django.urls import reverse
 from django.db.models import Q, Max
 from django.http import Http404, HttpResponse
 from django.shortcuts import render, redirect, get_object_or_404
 from django.db.models import Q, Max
 from django.http import Http404, HttpResponse
 from django.shortcuts import render, redirect, get_object_or_404
@@ -35,8 +32,8 @@ def list_new(request):
 def file_new(request, filename):
     division = 'new'
 
 def file_new(request, filename):
     division = 'new'
 
-    filepath = filename.encode('utf-8')
-    root_filepath = os.path.join(settings.NEW_PATH, filename.encode('utf-8'))
+    filepath = filename
+    root_filepath = os.path.join(settings.NEW_PATH, filename)
     if request.POST:
         form = AudiobookForm(request.POST)
         if form.is_valid():
     if request.POST:
         form = AudiobookForm(request.POST)
         if form.is_valid():
@@ -65,7 +62,7 @@ def file_new(request, filename):
                     d[tag] = None
 
     if not request.POST:
                     d[tag] = None
 
     if not request.POST:
-        form = AudiobookForm(d)
+        form = AudiobookForm(initial=d)
     return render(request, "archive/file_new.html", locals())
 
 
     return render(request, "archive/file_new.html", locals())
 
 
@@ -166,13 +163,13 @@ def publish(request, aid, publish=True):
         'url': audiobook.url,
         'tags': audiobook.new_publish_tags(),
         }
         'url': audiobook.url,
         'tags': audiobook.new_publish_tags(),
         }
-    audiobook.mp3_tags = tags
-    audiobook.ogg_tags = tags
+    audiobook.set_mp3_tags(tags)
+    audiobook.set_ogg_tags(tags)
     audiobook.mp3_status = audiobook.ogg_status = status.WAITING
     audiobook.save()
     # isn't there a race here?
     audiobook.mp3_status = audiobook.ogg_status = status.WAITING
     audiobook.save()
     # isn't there a race here?
-    audiobook.mp3_task = tasks.Mp3Task.delay(aid, publish).task_id
-    audiobook.ogg_task = tasks.OggTask.delay(aid, publish).task_id
+    audiobook.mp3_task = tasks.Mp3Task.delay(request.user.id, aid, publish).task_id
+    audiobook.ogg_task = tasks.OggTask.delay(request.user.id, aid, publish).task_id
     audiobook.save()
 
     return redirect(file_managed, aid)
     audiobook.save()
 
     return redirect(file_managed, aid)
@@ -186,23 +183,29 @@ def cancel_publishing(request, aid):
     # TODO: cancel tasks
     audiobook.mp3_status = None
     audiobook.ogg_status = None
     # TODO: cancel tasks
     audiobook.mp3_status = None
     audiobook.ogg_status = None
+    audiobook.youtube_status = None
     audiobook.save()
     return redirect(file_managed, aid)
 
 
 def download(request, aid, which="source"):
     audiobook.save()
     return redirect(file_managed, aid)
 
 
 def download(request, aid, which="source"):
-    if which not in ("source", "mp3", "ogg"):
+    if which not in ("source", "mp3", "ogg", 'mkv'):
         raise Http404
     audiobook = get_object_or_404(models.Audiobook, id=aid)
         raise Http404
     audiobook = get_object_or_404(models.Audiobook, id=aid)
-    file_ = getattr(audiobook, "%s_file" % which)
+    field = which
+    if which == 'mkv':
+        field = 'youtube'
+    file_ = getattr(audiobook, "%s_file" % field)
     if not file_:
         raise Http404
     ext = file_.path.rsplit('.', 1)[-1]
     if not file_:
         raise Http404
     ext = file_.path.rsplit('.', 1)[-1]
-    response = HttpResponse(mimetype='application/force-download')
+    response = HttpResponse(content_type='application/force-download')
     
     response['Content-Disposition'] = "attachment; filename*=UTF-8''%s.%s" % (
         quote(audiobook.title.encode('utf-8'), safe=''), ext)
     
     response['Content-Disposition'] = "attachment; filename*=UTF-8''%s.%s" % (
         quote(audiobook.title.encode('utf-8'), safe=''), ext)
-    response['X-Sendfile'] = file_.path.encode('utf-8')
+    with open(file_.path, 'rb') as f:
+        response.write(f.read())
+    #response['X-Sendfile'] = file_.path.encode('utf-8')
     return response
 
 
     return response
 
 
@@ -216,15 +219,18 @@ def list_unpublished(request):
 def list_publishing(request):
     division = 'publishing'
 
 def list_publishing(request):
     division = 'publishing'
 
-    objects = models.Audiobook.objects.exclude(mp3_status=None, ogg_status=None)
+    objects = models.Audiobook.objects.exclude(mp3_status=None, ogg_status=None, youtube_status=None)
     objects_by_status = {}
     for o in objects:
     objects_by_status = {}
     for o in objects:
+        statuses = set()
         if o.mp3_status:
         if o.mp3_status:
-            k = o.mp3_status, o.get_mp3_status_display()
-            objects_by_status.setdefault(k, []).append(o)
-        if o.ogg_status and o.ogg_status != o.mp3_status:
-            k = o.ogg_status, o.get_ogg_status_display()
-            objects_by_status.setdefault(k, []).append(o)
+            statuses.add((o.mp3_status, o.get_mp3_status_display()))
+        if o.ogg_status:
+            statuses.add((o.ogg_status, o.get_ogg_status_display()))
+        if o.youtube_status:
+            statuses.add((o.youtube_status, o.get_youtube_status_display()))
+        for status in statuses:
+            objects_by_status.setdefault(status, []).append(o)
     status_objects = sorted(objects_by_status.items(), reverse=True)
 
     return render(request, "archive/list_publishing.html", locals())
     status_objects = sorted(objects_by_status.items(), reverse=True)
 
     return render(request, "archive/list_publishing.html", locals())
@@ -258,6 +264,10 @@ def file_managed(request, id):
         tags = {}
     form = AudiobookForm(instance=audiobook)
 
         tags = {}
     form = AudiobookForm(instance=audiobook)
 
+    user_can_publish = (
+        request.user.is_authenticated and
+        request.user.oauthconnection_set.filter(access=True).exists())
+
     return render(request, "archive/file_managed.html", locals())
 
 
     return render(request, "archive/file_managed.html", locals())