paths
[audio.git] / src / archive / views.py
index 42acffc..6ae2927 100644 (file)
@@ -5,6 +5,7 @@ from urllib.parse import quote
 
 from archive import settings
 from django.contrib.auth.decorators import permission_required
 
 from archive import settings
 from django.contrib.auth.decorators import permission_required
+from django.contrib.postgres.search import SearchVector
 from django.urls import reverse
 from django.db.models import Q, Max
 from django.http import Http404, HttpResponse
 from django.urls import reverse
 from django.db.models import Q, Max
 from django.http import Http404, HttpResponse
@@ -23,8 +24,6 @@ from archive.utils import all_files
 
 
 def list_new(request):
 
 
 def list_new(request):
-    division = 'new'
-
     path = settings.NEW_PATH
     objects = sorted(all_files(path))
     return render(request, "archive/list_new.html", locals())
     path = settings.NEW_PATH
     objects = sorted(all_files(path))
     return render(request, "archive/list_new.html", locals())
@@ -32,8 +31,6 @@ def list_new(request):
 
 @permission_required('archive.change_audiobook')
 def file_new(request, filename):
 
 @permission_required('archive.change_audiobook')
 def file_new(request, filename):
-    division = 'new'
-
     filepath = filename
     root_filepath = os.path.join(settings.NEW_PATH, filename)
     if request.POST:
     filepath = filename
     root_filepath = os.path.join(settings.NEW_PATH, filename)
     if request.POST:
@@ -73,9 +70,8 @@ def file_new(request, filename):
 def move_to_archive(request, filename):
     """ move a new file to the unmanaged files dir """
 
 def move_to_archive(request, filename):
     """ move a new file to the unmanaged files dir """
 
-    filename_str = filename.encode('utf-8')
-    old_path = os.path.join(settings.NEW_PATH, filename_str)
-    new_path = os.path.join(settings.UNMANAGED_PATH, filename_str)
+    old_path = os.path.join(settings.NEW_PATH, filename)
+    new_path = os.path.join(settings.UNMANAGED_PATH, filename)
     new_dir = os.path.split(new_path)[0]
     if not os.path.isdir(new_dir):
         os.makedirs(new_dir)
     new_dir = os.path.split(new_path)[0]
     if not os.path.isdir(new_dir):
         os.makedirs(new_dir)
@@ -134,9 +130,8 @@ def remove_to_archive(request, aid):
 def move_to_new(request, filename):
     """ move a unmanaged file to new files dir """
 
 def move_to_new(request, filename):
     """ move a unmanaged file to new files dir """
 
-    filename_str = filename.encode('utf-8')
-    old_path = os.path.join(settings.UNMANAGED_PATH, filename_str)
-    new_path = os.path.join(settings.NEW_PATH, filename_str)
+    old_path = os.path.join(settings.UNMANAGED_PATH, filename)
+    new_path = os.path.join(settings.NEW_PATH, filename)
     new_dir = os.path.split(new_path)[0]
     if not os.path.isdir(new_dir):
         os.makedirs(new_dir)
     new_dir = os.path.split(new_path)[0]
     if not os.path.isdir(new_dir):
         os.makedirs(new_dir)
@@ -160,20 +155,7 @@ def move_to_new(request, filename):
 def publish(request, aid, publish=True):
     """ mark file for publishing """
     audiobook = get_object_or_404(models.Audiobook, id=aid)
 def publish(request, aid, publish=True):
     """ mark file for publishing """
     audiobook = get_object_or_404(models.Audiobook, id=aid)
-    tags = {
-        'name': audiobook.title,
-        'url': audiobook.url,
-        'tags': audiobook.new_publish_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_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()
-
+    audiobook.publish(request.user, publish=publish)
     return redirect(file_managed, aid)
 
 
     return redirect(file_managed, aid)
 
 
@@ -212,16 +194,7 @@ def download(request, aid, which="source"):
     return response
 
 
     return response
 
 
-def list_unpublished(request):
-    division = 'unpublished'
-
-    objects = models.Audiobook.objects.filter(Q(mp3_published=None) | Q(ogg_published=None))
-    return render(request, "archive/list_unpublished.html", locals())
-
-
 def list_publishing(request):
 def list_publishing(request):
-    division = 'publishing'
-
     objects = models.Audiobook.objects.exclude(
         mp3_status=None, ogg_status=None, youtube_status=None
     ).order_by("youtube_queued", "title")
     objects = models.Audiobook.objects.exclude(
         mp3_status=None, ogg_status=None, youtube_status=None
     ).order_by("youtube_queued", "title")
@@ -241,11 +214,12 @@ def list_publishing(request):
     return render(request, "archive/list_publishing.html", locals())
 
 
     return render(request, "archive/list_publishing.html", locals())
 
 
-def list_published(request):
-    division = 'published'
-
-    objects = models.Audiobook.objects.exclude(Q(mp3_published=None) | Q(ogg_published=None))
-    return render(request, "archive/list_published.html", locals())
+class AudiobookList(ListView):
+    def get_queryset(self):
+        qs = models.Audiobook.objects.all()
+        if 's' in self.request.GET:
+            qs = qs.annotate(s=SearchVector('title', 'slug')).filter(s=self.request.GET['s'])
+        return qs
 
 
 @permission_required('archive.change_audiobook')
 
 
 @permission_required('archive.change_audiobook')
@@ -260,13 +234,14 @@ def file_managed(request, id):
             except IOError:
                 raise Http404
 
             except IOError:
                 raise Http404
 
-    division = 'published' if audiobook.published() else 'unpublished'
-    path = audiobook.source_file.path[len(settings.FILES_PATH):].lstrip('/')
+    tags = {}
+    if audiobook.source_file:
+        path = audiobook.source_file.path[len(settings.FILES_PATH):].lstrip('/')
 
 
-    # for tags update
-    tags = mutagen.File(audiobook.source_file.path.encode('utf-8'))
-    if not tags:
-        tags = {}
+        # for tags update
+        tags = mutagen.File(audiobook.source_file.path.encode('utf-8'))
+        if not tags:
+            tags = {}
     form = AudiobookForm(instance=audiobook)
 
     user_can_publish = (
     form = AudiobookForm(instance=audiobook)
 
     user_can_publish = (
@@ -282,20 +257,22 @@ def file_managed(request, id):
         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})
 
         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})
 
+    from youtube.models import YouTube
+    youtube = YouTube.objects.first()
+    youtube_title = youtube.get_title(audiobook)
+    youtube_description = youtube.get_description(audiobook)
+
+            
     return render(request, "archive/file_managed.html", locals())
 
 
 def list_unmanaged(request):
     return render(request, "archive/file_managed.html", locals())
 
 
 def list_unmanaged(request):
-    division = 'unmanaged'
-
     objects = sorted(all_files(settings.UNMANAGED_PATH))
     return render(request, "archive/list_unmanaged.html", locals())
 
 
 def file_unmanaged(request, filename):
     objects = sorted(all_files(settings.UNMANAGED_PATH))
     return render(request, "archive/list_unmanaged.html", locals())
 
 
 def file_unmanaged(request, filename):
-    division = 'unmanaged'
-
-    tags = mutagen.File(os.path.join(settings.UNMANAGED_PATH, filename.encode('utf-8')))
+    tags = mutagen.File(os.path.join(settings.UNMANAGED_PATH, filename))
     if not tags:
         tags = {}
     
     if not tags:
         tags = {}
     
@@ -307,4 +284,39 @@ class BookView(ListView):
     template_name = 'archive/book.html'
 
     def get_queryset(self):
     template_name = 'archive/book.html'
 
     def get_queryset(self):
-        return models.Audiobook.objects.filter(slug=self.kwargs['slug'])
+        qs = models.Audiobook.objects.filter(slug=self.kwargs["slug"]).order_by(
+            "index"
+        )
+        last_vol = None
+        last_vol_sub = None
+        for b in qs:
+            if last_vol is None or last_vol.youtube_volume_index != b.youtube_volume_index:
+                last_vol = b
+                b.total = 0
+                if last_vol_sub is None or b.youtube_volume:
+                    last_vol_sub = last_vol
+                    last_vol_sub.total_for_sub = 0
+            last_vol.total += b.duration
+            last_vol_sub.total_for_sub += b.duration
+            b.subtotal = last_vol_sub.total_for_sub
+        return list(qs)
+
+
+@permission_required('archive.change_audiobook')
+def book_youtube_volume(request, aid):
+    audiobook = get_object_or_404(models.Audiobook, id=aid)
+    slug = audiobook.slug
+    cur_vol = audiobook.youtube_volume
+    new_vol = request.POST.get('volume', '')
+
+    audiobook.youtube_volume = new_vol
+    audiobook.save()
+    
+    for a in models.Audiobook.objects.filter(slug=slug, youtube_volume=cur_vol, index__gt=audiobook.index).order_by('index'):
+        if a.youtube_volume != cur_vol:
+            break
+        a.youtube_volume = new_vol
+        a.save()
+    
+    return redirect('book', audiobook.slug)
+