From 9e5d168e8de3d4806cc92a2fefaef9bc23359002 Mon Sep 17 00:00:00 2001 From: Philipp Wolfer Date: Sat, 21 Nov 2020 12:03:38 +0100 Subject: [PATCH] Support AIFF file format Fixes #1243 --- api/funkwhale_api/music/metadata.py | 5 ++++- api/funkwhale_api/music/utils.py | 4 ++++ api/tests/music/test.aiff | Bin 0 -> 17208 bytes api/tests/music/test_metadata.py | 28 +++++++++++++++++++++++++++ changes/changelog.d/1243.enhancement | 1 + front/src/store/ui.js | 2 +- 6 files changed, 38 insertions(+), 2 deletions(-) create mode 100644 api/tests/music/test.aiff create mode 100644 changes/changelog.d/1243.enhancement diff --git a/api/funkwhale_api/music/metadata.py b/api/funkwhale_api/music/metadata.py index ea914b89a..ffce86943 100644 --- a/api/funkwhale_api/music/metadata.py +++ b/api/funkwhale_api/music/metadata.py @@ -253,7 +253,7 @@ CONF = { "comment": {"field": "comment"}, }, }, - "MP3": { + "ID3": { "getter": get_id3_tag, "clean_pictures": clean_id3_pictures, "fields": { @@ -331,6 +331,9 @@ CONF = { }, } +CONF["MP3"] = CONF["ID3"] +CONF["AIFF"] = CONF["ID3"] + ALL_FIELDS = [ "position", "disc_number", diff --git a/api/funkwhale_api/music/utils.py b/api/funkwhale_api/music/utils.py index 17b5b7292..b863f416d 100644 --- a/api/funkwhale_api/music/utils.py +++ b/api/funkwhale_api/music/utils.py @@ -59,6 +59,10 @@ AUDIO_EXTENSIONS_AND_MIMETYPE = [ ("m4a", "audio/x-m4a"), ("flac", "audio/x-flac"), ("flac", "audio/flac"), + ("aif", "audio/aiff"), + ("aif", "audio/x-aiff"), + ("aiff", "audio/aiff"), + ("aiff", "audio/x-aiff"), ] EXTENSION_TO_MIMETYPE = {ext: mt for ext, mt in AUDIO_EXTENSIONS_AND_MIMETYPE} diff --git a/api/tests/music/test.aiff b/api/tests/music/test.aiff new file mode 100644 index 0000000000000000000000000000000000000000..2bf66fdadcf4c65ff7255fdd17f5e03501619c1c GIT binary patch literal 17208 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 literal 0 HcmV?d00001 diff --git a/api/tests/music/test_metadata.py b/api/tests/music/test_metadata.py index 28c39dd59..061840456 100644 --- a/api/tests/music/test_metadata.py +++ b/api/tests/music/test_metadata.py @@ -150,10 +150,38 @@ def test_can_get_metadata_from_id3_mp3_file(field, value): assert str(data.get(field)) == value +@pytest.mark.parametrize( + "field,value", + [ + ("title", "Bend"), + ("artist", "Binärpilot"), + ("album_artist", "Binärpilot"), + # ("artists", "Binärpilot; Another artist"), # FW does not properly extract multi-value artists from ID3 + ("album", "You Can't Stop Da Funk"), + ("date", "2006-02-07"), + ("position", "2/4"), + ("disc_number", "1/1"), + ("musicbrainz_albumid", "ce40cdb1-a562-4fd8-a269-9269f98d4124"), + ("mbid", "f269d497-1cc0-4ae4-a0c4-157ec7d73fcb"), + ("musicbrainz_artistid", "9c6bddde-6228-4d9f-ad0d-03f6fcb19e13"), + ("musicbrainz_albumartistid", "9c6bddde-6228-4d9f-ad0d-03f6fcb19e13"), + ("license", "https://creativecommons.org/licenses/by-nc-nd/2.5/"), + ("copyright", "Someone"), + ("comment", "Hello there"), + ], +) +def test_can_get_metadata_from_id3_aiff_file(field, value): + path = os.path.join(DATA_DIR, "test.aiff") + data = metadata.Metadata(path) + + assert str(data.get(field)) == value + + @pytest.mark.parametrize( "name", [ "test.mp3", + "test.aiff", "with_other_picture.mp3", "sample.flac", "with_cover.ogg", diff --git a/changes/changelog.d/1243.enhancement b/changes/changelog.d/1243.enhancement new file mode 100644 index 000000000..65d47c7fc --- /dev/null +++ b/changes/changelog.d/1243.enhancement @@ -0,0 +1 @@ +Support AIFF file format (#1243) \ No newline at end of file diff --git a/front/src/store/ui.js b/front/src/store/ui.js index ac679efff..f7717685d 100644 --- a/front/src/store/ui.js +++ b/front/src/store/ui.js @@ -11,7 +11,7 @@ export default { lastDate: new Date(), maxMessages: 100, messageDisplayDuration: 5 * 1000, - supportedExtensions: ["flac", "ogg", "mp3", "opus", "aac", "m4a"], + supportedExtensions: ["flac", "ogg", "mp3", "opus", "aac", "m4a", "aiff", "aif"], messages: [], theme: 'light', window: {