From baf5a350b3e175c7a70163f1ad57f2402a09ce42 Mon Sep 17 00:00:00 2001 From: Eliot Berriot Date: Wed, 24 Oct 2018 19:11:57 +0200 Subject: [PATCH] See #272: added admin and model for transcoding --- api/funkwhale_api/music/admin.py | 22 ++++++++ .../migrations/0033_auto_20181023_1837.py | 53 +++++++++++++++++++ api/funkwhale_api/music/models.py | 25 +++++++++ 3 files changed, 100 insertions(+) create mode 100644 api/funkwhale_api/music/migrations/0033_auto_20181023_1837.py diff --git a/api/funkwhale_api/music/admin.py b/api/funkwhale_api/music/admin.py index 8f9768857..fca544cc8 100644 --- a/api/funkwhale_api/music/admin.py +++ b/api/funkwhale_api/music/admin.py @@ -78,6 +78,28 @@ class UploadAdmin(admin.ModelAdmin): list_filter = ["mimetype", "import_status", "library__privacy_level"] +@admin.register(models.UploadVersion) +class UploadVersionAdmin(admin.ModelAdmin): + list_display = [ + "upload", + "audio_file", + "mimetype", + "size", + "bitrate", + "creation_date", + "accessed_date", + ] + list_select_related = ["upload"] + search_fields = [ + "upload__source", + "upload__acoustid_track_id", + "upload__track__title", + "upload__track__album__title", + "upload__track__artist__name", + ] + list_filter = ["mimetype"] + + def launch_scan(modeladmin, request, queryset): for library in queryset: library.schedule_scan(actor=request.user.actor, force=True) diff --git a/api/funkwhale_api/music/migrations/0033_auto_20181023_1837.py b/api/funkwhale_api/music/migrations/0033_auto_20181023_1837.py new file mode 100644 index 000000000..003349b53 --- /dev/null +++ b/api/funkwhale_api/music/migrations/0033_auto_20181023_1837.py @@ -0,0 +1,53 @@ +# Generated by Django 2.0.9 on 2018-10-23 18:37 + +from django.db import migrations, models +import django.db.models.deletion +import django.utils.timezone +import funkwhale_api.music.models + + +class Migration(migrations.Migration): + + dependencies = [ + ('music', '0032_track_file_to_upload'), + ] + + operations = [ + migrations.CreateModel( + name='UploadVersion', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('mimetype', models.CharField(choices=[('audio/ogg', 'ogg'), ('audio/mpeg', 'mp3'), ('audio/x-flac', 'flac')], max_length=50)), + ('creation_date', models.DateTimeField(default=django.utils.timezone.now)), + ('accessed_date', models.DateTimeField(blank=True, null=True)), + ('audio_file', models.FileField(max_length=255, upload_to=funkwhale_api.music.models.get_file_path)), + ('bitrate', models.PositiveIntegerField()), + ('size', models.IntegerField()), + ('upload', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='versions', to='music.Upload')), + ], + ), + migrations.AlterField( + model_name='album', + name='from_activity', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='federation.Activity'), + ), + migrations.AlterField( + model_name='artist', + name='from_activity', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='federation.Activity'), + ), + migrations.AlterField( + model_name='track', + name='from_activity', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='federation.Activity'), + ), + migrations.AlterField( + model_name='work', + name='from_activity', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='federation.Activity'), + ), + migrations.AlterUniqueTogether( + name='uploadversion', + unique_together={('upload', 'mimetype', 'bitrate')}, + ), + ] diff --git a/api/funkwhale_api/music/models.py b/api/funkwhale_api/music/models.py index 87f7ba819..71c511d33 100644 --- a/api/funkwhale_api/music/models.py +++ b/api/funkwhale_api/music/models.py @@ -578,6 +578,9 @@ TRACK_FILE_IMPORT_STATUS_CHOICES = ( def get_file_path(instance, filename): + if isinstance(instance, UploadVersion): + return common_utils.ChunkedPath("transcoded")(instance, filename) + if instance.library.actor.get_user(): return common_utils.ChunkedPath("tracks")(instance, filename) else: @@ -742,6 +745,28 @@ class Upload(models.Model): return self.track.listen_url + "?upload={}".format(self.uuid) +MIMETYPE_CHOICES = [ + (mt, ext) for ext, mt in utils.AUDIO_EXTENSIONS_AND_MIMETYPE +] + + +class UploadVersion(models.Model): + upload = models.ForeignKey(Upload, related_name='versions', on_delete=models.CASCADE) + mimetype = models.CharField(max_length=50, choices=MIMETYPE_CHOICES) + creation_date = models.DateTimeField(default=timezone.now) + accessed_date = models.DateTimeField(null=True, blank=True) + audio_file = models.FileField(upload_to=get_file_path, max_length=255) + bitrate = models.PositiveIntegerField() + size = models.IntegerField() + + class Meta: + unique_together = ('upload', 'mimetype', 'bitrate') + + @property + def filename(self): + return self.upload.filename + + IMPORT_STATUS_CHOICES = ( ("pending", "Pending"), ("finished", "Finished"),