From 281e079a27d5f168d0a57c79b17850bc4fcc65a1 Mon Sep 17 00:00:00 2001 From: Jan Szejko Date: Thu, 17 May 2018 15:00:42 +0200 Subject: [PATCH] more audio fields in api --- src/api/handlers.py | 6 ++-- .../migrations/0024_book_audio_length.py | 19 +++++++++++ src/catalogue/models/book.py | 34 ++++++++++++++++--- src/catalogue/signals.py | 1 + 4 files changed, 53 insertions(+), 7 deletions(-) create mode 100644 src/catalogue/migrations/0024_book_audio_length.py diff --git a/src/api/handlers.py b/src/api/handlers.py index 9e75c5387..893cd7e1b 100644 --- a/src/api/handlers.py +++ b/src/api/handlers.py @@ -161,7 +161,7 @@ class BookDetailHandler(BaseHandler, BookDetails): """ allowed_methods = ['GET'] fields = ['title', 'parent', 'children'] + Book.formats + [ - 'media', 'url', 'cover', 'cover_thumb', 'simple_thumb', 'simple_cover', 'fragment_data'] + [ + 'media', 'url', 'cover', 'cover_thumb', 'simple_thumb', 'simple_cover', 'fragment_data', 'audio_length'] + [ category_plural[c] for c in book_tag_categories] @piwik_track @@ -180,7 +180,7 @@ class AnonymousBooksHandler(AnonymousBaseHandler, BookDetails): """ allowed_methods = ('GET',) model = Book - fields = book_tag_categories + ['href', 'title', 'url', 'cover', 'cover_thumb', 'slug', 'simple_thumb'] + fields = book_tag_categories + ['href', 'title', 'url', 'cover', 'cover_thumb', 'slug', 'simple_thumb', 'has_audio'] @classmethod def genres(cls, book): @@ -307,7 +307,7 @@ class QuerySetProxy(models.QuerySet): class FilterBooksHandler(AnonymousBooksHandler): fields = book_tag_categories + [ - 'href', 'title', 'url', 'cover', 'cover_thumb', 'simple_thumb', 'slug', 'key'] + 'href', 'title', 'url', 'cover', 'cover_thumb', 'simple_thumb', 'has_audio', 'slug', 'key'] def read(self, request): key_sep = '$' diff --git a/src/catalogue/migrations/0024_book_audio_length.py b/src/catalogue/migrations/0024_book_audio_length.py new file mode 100644 index 000000000..89e38affa --- /dev/null +++ b/src/catalogue/migrations/0024_book_audio_length.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('catalogue', '0023_book_abstract'), + ] + + operations = [ + migrations.AddField( + model_name='book', + name='audio_length', + field=models.CharField(max_length=8, verbose_name='audio length', blank=True), + ), + ] diff --git a/src/catalogue/models/book.py b/src/catalogue/models/book.py index 3ab26c686..a1ca5bbed 100644 --- a/src/catalogue/models/book.py +++ b/src/catalogue/models/book.py @@ -71,6 +71,7 @@ class Book(models.Model): wiki_link = models.CharField(blank=True, max_length=240) print_on_demand = models.BooleanField(_('print on demand'), default=False) recommended = models.BooleanField(_('recommended'), default=False) + audio_length = models.CharField(_('audio length'), blank=True, max_length=8) # files generated during publication cover = EbookField( @@ -208,6 +209,32 @@ class Book(models.Model): def is_foreign(self): return self.language_code() != settings.LANGUAGE_CODE + def set_audio_length(self): + length = self.get_audio_length() + if length > 0: + self.audio_length = self.format_audio_length(length) + self.save() + + @staticmethod + def format_audio_length(seconds): + if seconds < 60*60: + minutes = seconds // 60 + seconds = seconds % 60 + return '%d:%02d' % (minutes, seconds) + else: + hours = seconds // 3600 + minutes = seconds % 3600 // 60 + seconds = seconds % 60 + return '%d:%02d:%02d' % (hours, minutes, seconds) + + def get_audio_length(self): + from mutagen.mp3 import MP3 + total = 0 + for media in self.get_mp3(): + audio = MP3(media.file.path) + total += audio.info.length + return int(total) + def has_media(self, type_): if type_ in Book.formats: return bool(getattr(self, "%s_file" % type_)) @@ -243,19 +270,18 @@ class Book(models.Model): has_description.short_description = _('description') has_description.boolean = True - # ugly ugly ugly def has_mp3_file(self): - return bool(self.has_media("mp3")) + return self.has_media("mp3") has_mp3_file.short_description = 'MP3' has_mp3_file.boolean = True def has_ogg_file(self): - return bool(self.has_media("ogg")) + return self.has_media("ogg") has_ogg_file.short_description = 'OGG' has_ogg_file.boolean = True def has_daisy_file(self): - return bool(self.has_media("daisy")) + return self.has_media("daisy") has_daisy_file.short_description = 'DAISY' has_daisy_file.boolean = True diff --git a/src/catalogue/signals.py b/src/catalogue/signals.py index 3adfedbb0..f3cacaaf7 100644 --- a/src/catalogue/signals.py +++ b/src/catalogue/signals.py @@ -19,6 +19,7 @@ from .models import BookMedia, Book, Collection, Fragment, Tag @receiver([post_save, post_delete], sender=BookMedia) def bookmedia_save(sender, instance, **kwargs): + instance.book.set_audio_length() instance.book.save() -- 2.20.1