diff --git a/api/funkwhale_api/music/models.py b/api/funkwhale_api/music/models.py
index 325cdacece4b2d471775bd769124a11cf7cb3e42..4ba8327179eebbe9f57628de37ab5faeb739ed5d 100644
--- a/api/funkwhale_api/music/models.py
+++ b/api/funkwhale_api/music/models.py
@@ -7,6 +7,7 @@ import uuid
 
 import markdown
 import pendulum
+import pydub
 from django.conf import settings
 from django.contrib.postgres.fields import JSONField
 from django.core.files.base import ContentFile
@@ -780,6 +781,15 @@ class Upload(models.Model):
             "size": self.get_file_size(),
         }
 
+    def get_audio_segment(self):
+        input = self.get_audio_file()
+        if not input:
+            return
+
+        input_format = utils.MIMETYPE_TO_EXTENSION[self.mimetype]
+        audio = pydub.AudioSegment.from_file(input, format=input_format)
+        return audio
+
     def save(self, **kwargs):
         if not self.mimetype:
             if self.audio_file:
@@ -824,10 +834,9 @@ class Upload(models.Model):
             0
         ] + ".{}".format(format)
         version.audio_file.save(new_name, f)
-        utils.transcode_file(
-            input=self.audio_file,
+        utils.transcode_audio(
+            audio=self.get_audio_segment(),
             output=version.audio_file,
-            input_format=utils.MIMETYPE_TO_EXTENSION[self.mimetype],
             output_format=utils.MIMETYPE_TO_EXTENSION[mimetype],
         )
         version.size = version.audio_file.size
diff --git a/api/funkwhale_api/music/utils.py b/api/funkwhale_api/music/utils.py
index ae5cda750820512d53a62b2090c85c56a30001dc..574f4c8e152fd7e6dd7bc87ae0d5183490a54c67 100644
--- a/api/funkwhale_api/music/utils.py
+++ b/api/funkwhale_api/music/utils.py
@@ -75,5 +75,9 @@ def get_actor_from_request(request):
 def transcode_file(input, output, input_format, output_format, **kwargs):
     with input.open("rb"):
         audio = pydub.AudioSegment.from_file(input, format=input_format)
+    return transcode_audio(audio, output, output_format, **kwargs)
+
+
+def transcode_audio(audio, output, output_format, **kwargs):
     with output.open("wb"):
         return audio.export(output, format=output_format, **kwargs)
diff --git a/api/tests/music/test_views.py b/api/tests/music/test_views.py
index aa1214f834ddf7191ec7ba6626373d6cdd9c204d..85ba2955a141f200fb1f0e81143d82cee2c78dcb 100644
--- a/api/tests/music/test_views.py
+++ b/api/tests/music/test_views.py
@@ -374,6 +374,32 @@ def test_listen_transcode(factories, now, logged_in_api_client, mocker):
     )
 
 
+@pytest.mark.parametrize("serve_path", [("/host/music",), ("/app/music",)])
+def test_listen_transcode_in_place(
+    serve_path, factories, now, logged_in_api_client, mocker, settings
+):
+    settings.MUSIC_DIRECTORY_PATH = "/app/music"
+    settings.MUSIC_DIRECTORY_SERVE_PATH = serve_path
+    upload = factories["music.Upload"](
+        import_status="finished",
+        library__actor__user=logged_in_api_client.user,
+        audio_file=None,
+        source="file://" + os.path.join(DATA_DIR, "test.ogg"),
+    )
+
+    assert upload.get_audio_segment()
+
+    url = reverse("api:v1:listen-detail", kwargs={"uuid": upload.track.uuid})
+    handle_serve = mocker.spy(views, "handle_serve")
+    response = logged_in_api_client.get(url, {"to": "mp3"})
+
+    assert response.status_code == 200
+
+    handle_serve.assert_called_once_with(
+        upload, user=logged_in_api_client.user, format="mp3"
+    )
+
+
 def test_user_can_create_library(factories, logged_in_api_client):
     actor = logged_in_api_client.user.create_actor()
     url = reverse("api:v1:libraries-list")
diff --git a/changes/changelog.d/688.bugfix b/changes/changelog.d/688.bugfix
new file mode 100644
index 0000000000000000000000000000000000000000..085f205cd9d461d389f1eab27d27d6ef6d6a76d7
--- /dev/null
+++ b/changes/changelog.d/688.bugfix
@@ -0,0 +1 @@
+Fix transcoding of in-place imported tracks (#688)