Use youtube volume name on thumbnails.
[audio.git] / src / archive / views.py
index f237fab..42acffc 100644 (file)
@@ -1,18 +1,17 @@
-# Create your views here.
-
 from datetime import datetime
 import os
 import os.path
 from urllib.parse import quote
 
 from archive import settings
 from datetime import datetime
 import os
 import os.path
 from urllib.parse import quote
 
 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
+from django.utils.translation import gettext as _
 from django.views.decorators.http import require_POST
 from django.views.decorators.http import require_POST
+from django.views.generic import ListView
 
 import mutagen
 
 
 import mutagen
 
@@ -186,23 +185,30 @@ 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.youtube_queued = 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 +222,20 @@ 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
+    ).order_by("youtube_queued", "title")
     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())
@@ -262,6 +273,15 @@ def file_managed(request, id):
         request.user.is_authenticated and
         request.user.oauthconnection_set.filter(access=True).exists())
 
         request.user.is_authenticated and
         request.user.oauthconnection_set.filter(access=True).exists())
 
+    alerts = []
+    parts_count = audiobook.parts_count
+    if parts_count > 1:
+        series = models.Audiobook.objects.filter(slug=audiobook.slug)
+        if not audiobook.index:
+            alerts.append(_('There is more than one part, but index is not set.'))
+        if set(series.values_list('index', flat=True)) != set(range(1, parts_count + 1)):
+            alerts.append(_('Part indexes are not 1..%(parts_count)d.') % {"parts_count": parts_count})
+
     return render(request, "archive/file_managed.html", locals())
 
 
     return render(request, "archive/file_managed.html", locals())
 
 
@@ -281,3 +301,10 @@ def file_unmanaged(request, filename):
     
     err_exists = request.GET.get('exists')
     return render(request, "archive/file_unmanaged.html", locals())
     
     err_exists = request.GET.get('exists')
     return render(request, "archive/file_unmanaged.html", locals())
+
+
+class BookView(ListView):
+    template_name = 'archive/book.html'
+
+    def get_queryset(self):
+        return models.Audiobook.objects.filter(slug=self.kwargs['slug'])