From 3d6f0b8b2c13d780e83c9f6072900ac695f13e47 Mon Sep 17 00:00:00 2001 From: Eliot Berriot Date: Fri, 27 Apr 2018 21:10:02 +0200 Subject: [PATCH] Fix #183: ensure in place imported files get a proper mimetype --- api/funkwhale_api/federation/serializers.py | 5 +++++ api/funkwhale_api/music/tasks.py | 7 +++++++ api/funkwhale_api/music/utils.py | 21 +++++++++++++++++---- api/tests/music/test_import.py | 1 + changes/changelog.d/183.bugfix | 1 + 5 files changed, 31 insertions(+), 4 deletions(-) create mode 100644 changes/changelog.d/183.bugfix diff --git a/api/funkwhale_api/federation/serializers.py b/api/funkwhale_api/federation/serializers.py index 00bb7d45b..38efdd3bf 100644 --- a/api/funkwhale_api/federation/serializers.py +++ b/api/funkwhale_api/federation/serializers.py @@ -1,3 +1,4 @@ +import logging import urllib.parse from django.urls import reverse @@ -21,6 +22,8 @@ AP_CONTEXT = [ {}, ] +logger = logging.getLogger(__name__) + class ActorSerializer(serializers.Serializer): id = serializers.URLField() @@ -620,6 +623,8 @@ class CollectionPageSerializer(serializers.Serializer): for i in raw_items: if i.is_valid(): valid_items.append(i) + else: + logger.debug('Invalid item %s: %s', i.data, i.errors) return valid_items diff --git a/api/funkwhale_api/music/tasks.py b/api/funkwhale_api/music/tasks.py index f2244d785..aaaa2cdca 100644 --- a/api/funkwhale_api/music/tasks.py +++ b/api/funkwhale_api/music/tasks.py @@ -1,3 +1,5 @@ +import os + from django.core.files.base import ContentFile from dynamic_preferences.registries import global_preferences_registry @@ -13,6 +15,7 @@ from funkwhale_api.providers.audiofile.tasks import import_track_data_from_path from django.conf import settings from . import models from . import lyrics as lyrics_utils +from . import utils as music_utils @celery.app.task(name='acoustid.set_on_track_file') @@ -129,6 +132,10 @@ def _do_import(import_job, replace=False, use_acoustid=True): elif not import_job.audio_file and not import_job.source.startswith('file://'): # not an implace import, and we have a source, so let's download it track_file.download_file() + elif not import_job.audio_file and import_job.source.startswith('file://'): + # in place import, we set mimetype from extension + path, ext = os.path.splitext(import_job.source) + track_file.mimetype = music_utils.get_type_from_ext(ext) track_file.save() import_job.status = 'finished' import_job.track_file = track_file diff --git a/api/funkwhale_api/music/utils.py b/api/funkwhale_api/music/utils.py index 7a851f7cc..49a639303 100644 --- a/api/funkwhale_api/music/utils.py +++ b/api/funkwhale_api/music/utils.py @@ -63,8 +63,21 @@ def compute_status(jobs): return 'finished' +AUDIO_EXTENSIONS_AND_MIMETYPE = [ + ('ogg', 'audio/ogg'), + ('mp3', 'audio/mpeg'), +] + +EXTENSION_TO_MIMETYPE = {ext: mt for ext, mt in AUDIO_EXTENSIONS_AND_MIMETYPE} +MIMETYPE_TO_EXTENSION = {mt: ext for ext, mt in AUDIO_EXTENSIONS_AND_MIMETYPE} + + def get_ext_from_type(mimetype): - mapping = { - 'audio/ogg': 'ogg', - 'audio/mpeg': 'mp3', - } + return MIMETYPE_TO_EXTENSION.get(mimetype) + + +def get_type_from_ext(extension): + if extension.startswith('.'): + # we remove leading dot + extension = extension[1:] + return EXTENSION_TO_MIMETYPE.get(extension) diff --git a/api/tests/music/test_import.py b/api/tests/music/test_import.py index 65e0242fb..fa1c98eb4 100644 --- a/api/tests/music/test_import.py +++ b/api/tests/music/test_import.py @@ -243,3 +243,4 @@ def test__do_import_in_place_mbid(factories, tmpfile): assert bool(tf.audio_file) is False assert tf.source == 'file:///test.ogg' + assert tf.mimetype == 'audio/ogg' diff --git a/changes/changelog.d/183.bugfix b/changes/changelog.d/183.bugfix new file mode 100644 index 000000000..03a28e9c3 --- /dev/null +++ b/changes/changelog.d/183.bugfix @@ -0,0 +1 @@ +Ensure in place imported files get a proper mimetype (#183)