From 27b248df6e279f64f7cf692b5f02367ff3b31812 Mon Sep 17 00:00:00 2001 From: Eliot Berriot Date: Thu, 3 Oct 2019 09:09:00 +0200 Subject: [PATCH] Fix #661: Support for M4A/AAC files --- api/funkwhale_api/music/metadata.py | 66 ++++++++++++++++++++ api/funkwhale_api/music/utils.py | 2 + api/tests/music/test.m4a | Bin 0 -> 51512 bytes api/tests/music/test_metadata.py | 30 +++++++++ changes/changelog.d/661.enhancement | 1 + front/src/components/library/FileUpload.vue | 2 +- 6 files changed, 100 insertions(+), 1 deletion(-) create mode 100644 api/tests/music/test.m4a create mode 100644 changes/changelog.d/661.enhancement diff --git a/api/funkwhale_api/music/metadata.py b/api/funkwhale_api/music/metadata.py index feec90cc7..801ea6a9b 100644 --- a/api/funkwhale_api/music/metadata.py +++ b/api/funkwhale_api/music/metadata.py @@ -70,6 +70,45 @@ def clean_id3_pictures(apic): return pictures +def get_mp4_tag(f, k): + if k == "pictures": + return f.get("covr") + raw_value = f.get(k, None) + + if not raw_value: + raise TagNotFound(k) + + value = raw_value[0] + try: + return value.decode() + except AttributeError: + return value + + +def get_mp4_position(raw_value): + return raw_value[0] + + +def clean_mp4_pictures(raw_pictures): + pictures = [] + for p in list(raw_pictures): + if p.imageformat == p.FORMAT_JPEG: + mimetype = "image/jpeg" + elif p.imageformat == p.FORMAT_PNG: + mimetype = "image/png" + else: + continue + pictures.append( + { + "mimetype": mimetype, + "content": bytes(p), + "description": "", + "type": mutagen.id3.PictureType.COVER_FRONT, + } + ) + return pictures + + def get_flac_tag(f, k): if k == "pictures": return f.pictures @@ -216,6 +255,33 @@ CONF = { "copyright": {"field": "TCOP"}, }, }, + "MP4": { + "getter": get_mp4_tag, + "clean_pictures": clean_mp4_pictures, + "fields": { + "position": {"field": "trkn", "to_application": get_mp4_position}, + "disc_number": {"field": "disk", "to_application": get_mp4_position}, + "title": {"field": "©nam"}, + "artist": {"field": "©ART"}, + "album_artist": {"field": "aART"}, + "album": {"field": "©alb"}, + "date": {"field": "©day"}, + "musicbrainz_albumid": { + "field": "----:com.apple.iTunes:MusicBrainz Album Id" + }, + "musicbrainz_artistid": { + "field": "----:com.apple.iTunes:MusicBrainz Artist Id" + }, + "genre": {"field": "©gen"}, + "musicbrainz_albumartistid": { + "field": "----:com.apple.iTunes:MusicBrainz Album Artist Id" + }, + "mbid": {"field": "----:com.apple.iTunes:MusicBrainz Track Id"}, + "pictures": {}, + "license": {"field": "----:com.apple.iTunes:LICENSE"}, + "copyright": {"field": "cprt"}, + }, + }, "FLAC": { "getter": get_flac_tag, "clean_pictures": clean_flac_pictures, diff --git a/api/funkwhale_api/music/utils.py b/api/funkwhale_api/music/utils.py index bf3a0daf6..09c8cbd12 100644 --- a/api/funkwhale_api/music/utils.py +++ b/api/funkwhale_api/music/utils.py @@ -34,6 +34,8 @@ AUDIO_EXTENSIONS_AND_MIMETYPE = [ ("ogg", "audio/ogg"), ("opus", "audio/opus"), ("mp3", "audio/mpeg"), + ("aac", "audio/x-m4a"), + ("m4a", "audio/x-m4a"), ("flac", "audio/x-flac"), ("flac", "audio/flac"), ] diff --git a/api/tests/music/test.m4a b/api/tests/music/test.m4a new file mode 100644 index 0000000000000000000000000000000000000000..57b65b7b53489c85cb7a9e5ca5fa92fa976c35ea GIT binary patch literal 51512 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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 716d9c979..9a3826ce3 100644 --- a/api/tests/music/test_metadata.py +++ b/api/tests/music/test_metadata.py @@ -149,6 +149,7 @@ def test_can_get_metadata_from_id3_mp3_file(field, value): "sample.flac", "with_cover.ogg", "with_cover.opus", + "test.m4a", ], ) def test_can_get_pictures(name): @@ -189,6 +190,35 @@ def test_can_get_metadata_from_flac_file(field, value): assert data.get(field) == value +@pytest.mark.parametrize( + "field,value", + [ + ("title", "Peer Gynt Suite no. 1, op. 46: I. Morning"), + ("artist", "Edvard Grieg"), + ("album_artist", "Edvard Grieg; Musopen Symphony Orchestra"), + ("album", "Peer Gynt Suite no. 1, op. 46"), + ("date", "2012-08-15"), + ("position", 1), + ("disc_number", 2), + ("musicbrainz_albumid", "a766da8b-8336-47aa-a3ee-371cc41ccc75"), + ("mbid", "bd21ac48-46d8-4e78-925f-d9cc2a294656"), + ("musicbrainz_artistid", "013c8e5b-d72a-4cd3-8dee-6c64d6125823"), + ( + "musicbrainz_albumartistid", + "013c8e5b-d72a-4cd3-8dee-6c64d6125823;5b4d7d2d-36df-4b38-95e3-a964234f520f", + ), + ("license", "Dummy license: http://creativecommons.org/licenses/by-sa/4.0/"), + ("copyright", "Someone"), + ("genre", "Dubstep"), + ], +) +def test_can_get_metadata_from_m4a_file(field, value): + path = os.path.join(DATA_DIR, "test.m4a") + data = metadata.Metadata(path) + + assert data.get(field) == value + + def test_can_get_metadata_from_flac_file_not_crash_if_empty(): path = os.path.join(DATA_DIR, "sample.flac") data = metadata.Metadata(path) diff --git a/changes/changelog.d/661.enhancement b/changes/changelog.d/661.enhancement new file mode 100644 index 000000000..38553fbfa --- /dev/null +++ b/changes/changelog.d/661.enhancement @@ -0,0 +1 @@ +Support for M4A/AAC files (#661) diff --git a/front/src/components/library/FileUpload.vue b/front/src/components/library/FileUpload.vue index 025eab930..d88efd5ab 100644 --- a/front/src/components/library/FileUpload.vue +++ b/front/src/components/library/FileUpload.vue @@ -158,7 +158,7 @@ export default { currentTab: "summary", uploadUrl: this.$store.getters['instance/absoluteUrl']("/api/v1/uploads/"), importReference, - supportedExtensions: ["flac", "ogg", "mp3", "opus"], + supportedExtensions: ["flac", "ogg", "mp3", "opus", "aac", "m4a"], isLoadingQuota: false, quotaStatus: null, uploads: {