Missing import.
[audio.git] / src / archive / views.py
index 55f4f07..aee88e6 100644 (file)
@@ -1,17 +1,15 @@
-# 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
+from django.utils.translation import gettext as _
 from django.views.decorators.http import require_POST
 
 import mutagen
 from django.views.decorators.http import require_POST
 
 import mutagen
@@ -166,8 +164,8 @@ 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?
@@ -186,23 +184,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 +220,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())
@@ -262,6 +269,17 @@ 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 = []
+    series = models.Audiobook.objects.filter(url=audiobook.url)
+    real = series.count()
+    if real != audiobook.parts_count:
+        alerts.append(_('Parts number inconsitent. Declared number: %(declared)d. Real number: %(real)d') % {"declared": audiobook.parts_count, "real": real})
+    if audiobook.parts_count > 1:
+        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, audiobook.parts_count + 1)):
+            alerts.append(_('Part indexes are not 1..%(parts_count)d.') % {"parts_count": audiobook.parts_count})
+
     return render(request, "archive/file_managed.html", locals())
 
 
     return render(request, "archive/file_managed.html", locals())