X-Git-Url: https://git.mdrn.pl/audio.git/blobdiff_plain/1c72d045af4d7c5607a872a678eadec17498bd6d..fccf7669328b236987c1c49c03e35d3916c0093c:/src/archive/models.py diff --git a/src/archive/models.py b/src/archive/models.py index b15bec2..aa84ce4 100644 --- a/src/archive/models.py +++ b/src/archive/models.py @@ -1,9 +1,12 @@ import io import json +from os import unlink import os.path +from urllib.parse import urljoin from django.db import models from time import sleep +from django.contrib.sites.models import Site from django.utils.functional import cached_property from django.utils.timezone import now from django.utils.translation import gettext_lazy as _ @@ -12,6 +15,7 @@ import requests from archive.constants import status from archive.settings import FILES_SAVE_PATH, ADVERT, ORGANIZATION, PROJECT from archive.utils import OverwriteStorage, sha1_file +from youtube.utils import concat_audio, standardize_audio class License(models.Model): @@ -28,7 +32,10 @@ class Project(models.Model): name = models.CharField(max_length=128, unique=True, db_index=True, verbose_name="Nazwa") sponsors = models.TextField(blank=True, null=True, verbose_name="Sponsorzy") description = models.TextField(blank=True, verbose_name="Opis") + config = models.ForeignKey('Config', models.PROTECT) youtube = models.ForeignKey('youtube.YouTube', models.PROTECT) + icon = models.FileField(upload_to='archive/project', blank=True, null=True) + info_flac = models.FileField(upload_to='archive/info_flac', blank=True) class Meta: verbose_name = _("project") @@ -46,16 +53,42 @@ class Project(models.Model): " finansowanego przez %s" % self.sponsors if self.sponsors else "", ) + def get_icon_url(self): + if not self.icon: + return '' + return urljoin( + 'https://' + Site.objects.get_current().domain, + self.icon.url + ) + -class Piece(models.Model): +class Config(models.Model): name = models.CharField(max_length=255) - source_file = models.FileField(upload_to='piece') - is_outro = models.BooleanField(default=False) - min_audiobook_duration = models.IntegerField(default=0) + intro_flac = models.FileField(upload_to='config/intro_flac', blank=True) + intro_min_seconds = models.IntegerField() + outro_flac = models.FileField(upload_to='config/outro_flac', blank=True) + outro_min_seconds = models.IntegerField() + + class Meta: + verbose_name = _("Configuration") + verbose_name_plural = _("Configurations") def __str__(self): return self.name + def prepare_audio(self, audiobook): + total_duration = audiobook.total_duration + files = [] + if self.intro_flac and total_duration > self.intro_min_seconds and audiobook.is_first: + files.append(standardize_audio(self.intro_flac.path)) + files.append(standardize_audio(audiobook.source_file.path)) + if self.outro_flac and total_duration > self.outro_min_seconds and audiobook.is_last: + files.append(standardize_audio(self.outro_flac.path)) + output = concat_audio(files) + for d in files: + unlink(d) + return output + def source_upload_to(intance, filename): return os.path.join(FILES_SAVE_PATH, filename) # FIXME: what about really long file names? @@ -65,6 +98,7 @@ class Audiobook(models.Model): source_file = models.FileField(upload_to=source_upload_to, max_length=255, verbose_name=_('source file'), editable=False) source_sha1 = models.CharField(max_length=40, editable=False) + duration = models.FloatField(null=True, editable=False) title = models.CharField(max_length=255, verbose_name=_('title')) part_name = models.CharField(max_length=255, verbose_name=_('part name'), help_text=_('eg. chapter in a novel'), @@ -127,6 +161,18 @@ class Audiobook(models.Model): def parts_count(self): return type(self).objects.filter(slug=self.slug).count() + @property + def total_duration(self): + return type(self).objects.filter(slug=self.slug).aggregate(s=models.Sum('duration'))['s'] + + @property + def is_first(self): + return not type(self).objects.filter(slug=self.slug, index__lte=self.index).exclude(pk=self.pk).exists() + + @property + def is_last(self): + return not type(self).objects.filter(slug=self.slug, index__gte=self.index).exclude(pk=self.pk).exists() + @property def youtube_volume_count(self): total = 0 @@ -173,6 +219,24 @@ class Audiobook(models.Model): def published(self): return self.mp3_published and self.ogg_published + def prepare_for_publish(self): + tags = { + 'name': self.title, + 'url': self.url, + 'tags': self.new_publish_tags(), + } + self.set_mp3_tags(tags) + self.set_ogg_tags(tags) + self.mp3_status = self.ogg_status = status.WAITING + self.save() + + def publish(self, user, publish=True): + from . import tasks + # isn't there a race here? + self.mp3_task = tasks.Mp3Task.delay(user.id, self.pk, publish=publish).task_id + self.ogg_task = tasks.OggTask.delay(user.id, self.pk, publish=publish).task_id + self.save() + def get_source_sha1(self): assert self.pk or self.source_sha1 if not self.source_sha1: @@ -222,6 +286,9 @@ class Audiobook(models.Model): tags['flac_sha1'] = self.source_sha1 return tags + def prepare_audio(self): + return self.project.config.prepare_audio(self) + @cached_property def book(self): if self.slug: