From 5a2cf9112b58d629026bec7d1fa7342b8d298c57 Mon Sep 17 00:00:00 2001
From: Eliot Berriot <contact@eliotberriot.com>
Date: Tue, 4 Dec 2018 15:31:08 +0100
Subject: [PATCH] Fixed #621: None extension when downloading an in-place
 imported file

---
 api/funkwhale_api/music/factories.py |  2 +-
 api/funkwhale_api/music/models.py    | 13 ++++++++++---
 api/tests/music/test_models.py       |  2 ++
 changes/changelog.d/621.bugfix       |  1 +
 4 files changed, 14 insertions(+), 4 deletions(-)
 create mode 100644 changes/changelog.d/621.bugfix

diff --git a/api/funkwhale_api/music/factories.py b/api/funkwhale_api/music/factories.py
index a06ada80..8a7e84a9 100644
--- a/api/funkwhale_api/music/factories.py
+++ b/api/funkwhale_api/music/factories.py
@@ -121,7 +121,7 @@ class UploadFactory(factory.django.DjangoModelFactory):
         model = "music.Upload"
 
     class Params:
-        in_place = factory.Trait(audio_file=None)
+        in_place = factory.Trait(audio_file=None, mimetype=None)
         playable = factory.Trait(
             import_status="finished", library__privacy_level="everyone"
         )
diff --git a/api/funkwhale_api/music/models.py b/api/funkwhale_api/music/models.py
index a8f4530b..97c74a9a 100644
--- a/api/funkwhale_api/music/models.py
+++ b/api/funkwhale_api/music/models.py
@@ -738,9 +738,10 @@ class Upload(models.Model):
             return utils.MIMETYPE_TO_EXTENSION[self.mimetype]
         except KeyError:
             pass
-        if not self.audio_file:
-            return
-        return os.path.splitext(self.audio_file.name)[-1].replace(".", "", 1)
+        if self.audio_file:
+            return os.path.splitext(self.audio_file.name)[-1].replace(".", "", 1)
+        if self.in_place_path:
+            return os.path.splitext(self.in_place_path)[-1].replace(".", "", 1)
 
     def get_file_size(self):
         if self.audio_file:
@@ -823,6 +824,12 @@ class Upload(models.Model):
 
         return version
 
+    @property
+    def in_place_path(self):
+        if not self.source or not self.source.startswith("file://"):
+            return
+        return self.source.lstrip("file://")
+
 
 MIMETYPE_CHOICES = [(mt, ext) for ext, mt in utils.AUDIO_EXTENSIONS_AND_MIMETYPE]
 
diff --git a/api/tests/music/test_models.py b/api/tests/music/test_models.py
index 891a9984..cabe1526 100644
--- a/api/tests/music/test_models.py
+++ b/api/tests/music/test_models.py
@@ -490,6 +490,7 @@ def test_fid_is_populated(factories, model, factory_args, namespace):
     [
         ({"audio_file__filename": "test.mp3", "mimetype": None}, "mp3"),
         ({"mimetype": "audio/mpeg"}, "mp3"),
+        ({"in_place": True, "source": "file:///test.mp3"}, "mp3"),
         ({"audio_file__filename": "test.None", "mimetype": "audio/mpeg"}, "mp3"),
         ({"audio_file__filename": "test.None", "mimetype": "audio/flac"}, "flac"),
         ({"audio_file__filename": "test.None", "mimetype": "audio/x-flac"}, "flac"),
@@ -497,6 +498,7 @@ def test_fid_is_populated(factories, model, factory_args, namespace):
 )
 def test_upload_extension(factory_args, factories, expected):
     upload = factories["music.Upload"].build(**factory_args)
+
     assert upload.extension == expected
 
 
diff --git a/changes/changelog.d/621.bugfix b/changes/changelog.d/621.bugfix
new file mode 100644
index 00000000..cd15865e
--- /dev/null
+++ b/changes/changelog.d/621.bugfix
@@ -0,0 +1 @@
+Fixed None extension when downloading an in-place imported file (#621)
-- 
GitLab