From 3d6f0b8b2c13d780e83c9f6072900ac695f13e47 Mon Sep 17 00:00:00 2001
From: Eliot Berriot <contact@eliotberriot.com>
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 00bb7d45b0..38efdd3bf7 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 f2244d7852..aaaa2cdca1 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 7a851f7cc3..49a6393034 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 65e0242fb0..fa1c98eb4c 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 0000000000..03a28e9c39
--- /dev/null
+++ b/changes/changelog.d/183.bugfix
@@ -0,0 +1 @@
+Ensure in place imported files get a proper mimetype (#183)
-- 
GitLab