diff --git a/api/funkwhale_api/music/models.py b/api/funkwhale_api/music/models.py
index f95a8bb3b123d06c0db636449257281467c82002..3e39e91e2d2cbd228fd530560f29edacdccd19f8 100644
--- a/api/funkwhale_api/music/models.py
+++ b/api/funkwhale_api/music/models.py
@@ -855,8 +855,7 @@ class Upload(models.Model):
         if not input:
             return
 
-        input_format = utils.MIMETYPE_TO_EXTENSION[self.mimetype]
-        audio = pydub.AudioSegment.from_file(input, format=input_format)
+        audio = pydub.AudioSegment.from_file(input)
         return audio
 
     def save(self, **kwargs):
diff --git a/api/funkwhale_api/music/utils.py b/api/funkwhale_api/music/utils.py
index b863f416da1833b5f8aaa874c135babf799b4710..4e94c47a1c72ca13dc1672010acce91a6148144b 100644
--- a/api/funkwhale_api/music/utils.py
+++ b/api/funkwhale_api/music/utils.py
@@ -105,7 +105,7 @@ def get_actor_from_request(request):
     return actor
 
 
-def transcode_file(input, output, input_format, output_format, **kwargs):
+def transcode_file(input, output, input_format=None, output_format="mp3", **kwargs):
     with input.open("rb"):
         audio = pydub.AudioSegment.from_file(input, format=input_format)
     return transcode_audio(audio, output, output_format, **kwargs)
diff --git a/api/tests/music/test_utils.py b/api/tests/music/test_utils.py
index 67a4212d89e1b22391051a88d90d651228e37a40..0c477312da1d34521e69239ad1e2106db7f42b89 100644
--- a/api/tests/music/test_utils.py
+++ b/api/tests/music/test_utils.py
@@ -1,6 +1,7 @@
 import os
 import pathlib
 import pytest
+import tempfile
 
 from funkwhale_api.music import utils
 
@@ -28,6 +29,7 @@ def test_guess_mimetype_try_using_extension_if_fail(wrong, factories, mocker):
         ("sample.flac", {"bitrate": 1608000, "length": 0.001}),
         ("test.mp3", {"bitrate": 8000, "length": 267.70285714285717}),
         ("test.ogg", {"bitrate": 112000, "length": 1}),
+        ("test.opus", {"bitrate": 0, "length": 1}),  # This Opus file lacks a bitrate
     ],
 )
 def test_get_audio_file_data(name, expected):
@@ -109,3 +111,22 @@ def test_get_dirs_and_files(path, expected, tmpdir):
     (root_path / "System" / "file.ogg").touch()
 
     assert utils.browse_dir(root_path, path) == expected
+
+
+@pytest.mark.parametrize(
+    "name, expected",
+    [
+        ("sample.flac", {"bitrate": 128000, "length": 0}),
+        ("test.mp3", {"bitrate": 16000, "length": 268}),
+        ("test.ogg", {"bitrate": 128000, "length": 1}),
+        ("test.opus", {"bitrate": 128000, "length": 1}),
+    ],
+)
+def test_transcode_file(name, expected):
+    path = pathlib.Path(os.path.join(DATA_DIR, name))
+    with tempfile.NamedTemporaryFile() as dest:
+        utils.transcode_file(path, pathlib.Path(dest.name))
+        with open(dest.name, "rb") as f:
+            result = {k: round(v) for k, v in utils.get_audio_file_data(f).items()}
+
+            assert result == expected
diff --git a/changes/changelog.d/1274.bugfix b/changes/changelog.d/1274.bugfix
new file mode 100644
index 0000000000000000000000000000000000000000..8dfe061aceb5902f947d8137896e799a53c3ae6a
--- /dev/null
+++ b/changes/changelog.d/1274.bugfix
@@ -0,0 +1 @@
+Changed audio format detection to happen via sniffing and not file extensions (#1274)