diff --git a/api/funkwhale_api/music/metadata.py b/api/funkwhale_api/music/metadata.py
index 9aa08820ac6e069ff38cd75d95eef79c11c8bd23..4c754ae05634eebf90f9e1e585d6542806ac407d 100644
--- a/api/funkwhale_api/music/metadata.py
+++ b/api/funkwhale_api/music/metadata.py
@@ -114,6 +114,22 @@ VALIDATION = {
 }
 
 CONF = {
+    "OggOpus": {
+        "getter": lambda f, k: f[k][0],
+        "fields": {
+            "track_number": {
+                "field": "TRACKNUMBER",
+                "to_application": convert_track_number,
+            },
+            "title": {},
+            "artist": {},
+            "album": {},
+            "date": {"field": "date", "to_application": get_date},
+            "musicbrainz_albumid": {},
+            "musicbrainz_artistid": {},
+            "musicbrainz_recordingid": {"field": "musicbrainz_trackid"},
+        },
+    },
     "OggVorbis": {
         "getter": lambda f, k: f[k][0],
         "fields": {
diff --git a/api/funkwhale_api/music/utils.py b/api/funkwhale_api/music/utils.py
index 30f62f3485838f2a6b626e5d0b24a44144fb885c..92187d69a12f004086acc4da7d5cada9cc43c630 100644
--- a/api/funkwhale_api/music/utils.py
+++ b/api/funkwhale_api/music/utils.py
@@ -54,7 +54,7 @@ def get_audio_file_data(f):
     if not data:
         return
     d = {}
-    d["bitrate"] = data.info.bitrate
+    d["bitrate"] = getattr(data.info, "bitrate", 0)
     d["length"] = data.info.length
 
     return d
diff --git a/api/tests/music/test.opus b/api/tests/music/test.opus
new file mode 100644
index 0000000000000000000000000000000000000000..c3ca732b3e5032f35d3127597d62b95a155f1bd6
Binary files /dev/null and b/api/tests/music/test.opus differ
diff --git a/api/tests/music/test_metadata.py b/api/tests/music/test_metadata.py
index 1dfe927a07cde6e69f059d2a50f125a082331198..f105b6b7e3b627defe40c60105d2038e9883e50f 100644
--- a/api/tests/music/test_metadata.py
+++ b/api/tests/music/test_metadata.py
@@ -9,6 +9,26 @@ from funkwhale_api.music import metadata
 DATA_DIR = os.path.dirname(os.path.abspath(__file__))
 
 
+@pytest.mark.parametrize(
+    "field,value",
+    [
+        ("title", "Peer Gynt Suite no. 1, op. 46: I. Morning"),
+        ("artist", "Edvard Grieg"),
+        ("album", "Peer Gynt Suite no. 1, op. 46"),
+        ("date", datetime.date(2012, 8, 15)),
+        ("track_number", 1),
+        ("musicbrainz_albumid", uuid.UUID("a766da8b-8336-47aa-a3ee-371cc41ccc75")),
+        ("musicbrainz_recordingid", uuid.UUID("bd21ac48-46d8-4e78-925f-d9cc2a294656")),
+        ("musicbrainz_artistid", uuid.UUID("013c8e5b-d72a-4cd3-8dee-6c64d6125823")),
+    ],
+)
+def test_can_get_metadata_from_opus_file(field, value):
+    path = os.path.join(DATA_DIR, "test.opus")
+    data = metadata.Metadata(path)
+
+    assert data.get(field) == value
+
+
 @pytest.mark.parametrize(
     "field,value",
     [