diff --git a/api/funkwhale_api/music/metadata.py b/api/funkwhale_api/music/metadata.py index 9aa08820a..4c754ae05 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 30f62f348..92187d69a 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 000000000..c3ca732b3 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 1dfe927a0..f105b6b7e 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", [