From 1a1878445c949eb4f992a88836c1ec6bd4334051 Mon Sep 17 00:00:00 2001 From: Eliot Berriot Date: Mon, 26 Aug 2019 14:08:00 +0200 Subject: [PATCH] Fixed album art not being retrieved from Ogg/Opus files --- api/funkwhale_api/music/metadata.py | 4 ++++ api/tests/music/test_metadata.py | 9 ++++++++- api/tests/music/with_cover.opus | Bin 0 -> 25696 bytes changes/changelog.d/opus-cover.bugfix | 1 + 4 files changed, 13 insertions(+), 1 deletion(-) create mode 100644 api/tests/music/with_cover.opus create mode 100644 changes/changelog.d/opus-cover.bugfix diff --git a/api/funkwhale_api/music/metadata.py b/api/funkwhale_api/music/metadata.py index 6740bd4f3..4bdf04dde 100644 --- a/api/funkwhale_api/music/metadata.py +++ b/api/funkwhale_api/music/metadata.py @@ -147,6 +147,10 @@ CONF = { "license": {}, "copyright": {}, "genre": {}, + "pictures": { + "field": "metadata_block_picture", + "to_application": clean_ogg_pictures, + }, }, }, "OggVorbis": { diff --git a/api/tests/music/test_metadata.py b/api/tests/music/test_metadata.py index 121fef4b2..521850e9a 100644 --- a/api/tests/music/test_metadata.py +++ b/api/tests/music/test_metadata.py @@ -142,7 +142,14 @@ def test_can_get_metadata_from_id3_mp3_file(field, value): @pytest.mark.parametrize( - "name", ["test.mp3", "with_other_picture.mp3", "sample.flac", "with_cover.ogg"] + "name", + [ + "test.mp3", + "with_other_picture.mp3", + "sample.flac", + "with_cover.ogg", + "with_cover.opus", + ], ) def test_can_get_pictures(name): path = os.path.join(DATA_DIR, name) diff --git a/api/tests/music/with_cover.opus b/api/tests/music/with_cover.opus new file mode 100644 index 0000000000000000000000000000000000000000..1b92b5cbb098e47c9722c01fa9caa0700c1284f9 GIT binary patch literal 25696 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