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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 IKZU^m1DymAIRF3v 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: {