From 08ce00e3cd854b4ab83f45daff5ffc6b85a60da6 Mon Sep 17 00:00:00 2001 From: Eliot Berriot Date: Mon, 14 Jan 2019 14:50:33 +0100 Subject: [PATCH] Fixed #469: parsing of embedded file cover for ogg files tagged with MusicBrainz Picard --- api/funkwhale_api/music/metadata.py | 81 +++++++++++++++++++++++++--- api/tests/music/test_metadata.py | 23 +++++++- api/tests/music/with_cover.ogg | Bin 0 -> 40414 bytes changes/changelog.d/469.bugfix | 1 + 4 files changed, 96 insertions(+), 9 deletions(-) create mode 100644 api/tests/music/with_cover.ogg create mode 100644 changes/changelog.d/469.bugfix diff --git a/api/funkwhale_api/music/metadata.py b/api/funkwhale_api/music/metadata.py index 9a61e67e1..ad8a6b6a5 100644 --- a/api/funkwhale_api/music/metadata.py +++ b/api/funkwhale_api/music/metadata.py @@ -1,8 +1,13 @@ +import base64 import datetime import logging -import mutagen import pendulum +import mutagen._util +import mutagen.oggtheora +import mutagen.oggvorbis +import mutagen.flac + from django import forms logger = logging.getLogger(__name__) @@ -83,6 +88,31 @@ def clean_flac_pictures(apic): return pictures +def clean_ogg_pictures(metadata_block_picture): + pictures = [] + for b64_data in [metadata_block_picture]: + + try: + data = base64.b64decode(b64_data) + except (TypeError, ValueError): + continue + + try: + picture = mutagen.flac.Picture(data) + except mutagen.flac.FLACError: + continue + + pictures.append( + { + "mimetype": picture.mime, + "content": picture.data, + "description": "", + "type": picture.type.real, + } + ) + return pictures + + def get_mp3_recording_id(f, k): try: return [t for t in f.tags.getall("UFID") if "musicbrainz.org" in t.owner][ @@ -197,6 +227,10 @@ CONF = { "musicbrainz_recordingid": {"field": "musicbrainz_trackid"}, "license": {}, "copyright": {}, + "pictures": { + "field": "metadata_block_picture", + "to_application": clean_ogg_pictures, + }, }, }, "OggTheora": { @@ -216,9 +250,8 @@ CONF = { "musicbrainz_artistid": {"field": "MusicBrainz Artist Id"}, "musicbrainz_albumartistid": {"field": "MusicBrainz Album Artist Id"}, "musicbrainz_recordingid": {"field": "MusicBrainz Track Id"}, - # somehow, I cannot successfully create an ogg theora file - # with the proper license field - # "license": {"field": "license"}, + "license": {}, + "copyright": {}, }, }, "MP3": { @@ -288,10 +321,11 @@ ALL_FIELDS = [ class Metadata(object): - def __init__(self, path): - self._file = mutagen.File(path) + def __init__(self, filething, kind=mutagen.File): + self._file = kind(filething) if self._file is None: - raise ValueError("Cannot parse metadata from {}".format(path)) + raise ValueError("Cannot parse metadata from {}".format(filething)) + self.fallback = self.load_fallback(filething, self._file) ft = self.get_file_type(self._file) try: self._conf = CONF[ft] @@ -301,7 +335,40 @@ class Metadata(object): def get_file_type(self, f): return f.__class__.__name__ + def load_fallback(self, filething, parent): + """ + In some situations, such as Ogg Theora files tagged with MusicBrainz Picard, + part of the tags are only available in the ogg vorbis comments + """ + try: + filething.seek(0) + except AttributeError: + pass + if isinstance(parent, mutagen.oggtheora.OggTheora): + try: + return Metadata(filething, kind=mutagen.oggvorbis.OggVorbis) + except (ValueError, mutagen._util.MutagenError): + raise + pass + def get(self, key, default=NODEFAULT): + try: + return self._get_from_self(key) + except TagNotFound: + if not self.fallback: + if default != NODEFAULT: + return default + else: + raise + else: + return self.fallback.get(key, default=default) + except UnsupportedTag: + if not self.fallback: + raise + else: + return self.fallback.get(key, default=default) + + def _get_from_self(self, key, default=NODEFAULT): try: field_conf = self._conf["fields"][key] except KeyError: diff --git a/api/tests/music/test_metadata.py b/api/tests/music/test_metadata.py index 4413f3a3b..5e5590d7d 100644 --- a/api/tests/music/test_metadata.py +++ b/api/tests/music/test_metadata.py @@ -1,9 +1,11 @@ import datetime import os import uuid - import pytest +import mutagen.oggtheora +import mutagen.oggvorbis + from funkwhale_api.music import metadata DATA_DIR = os.path.dirname(os.path.abspath(__file__)) @@ -145,7 +147,7 @@ def test_can_get_metadata_from_id3_mp3_file(field, value): assert data.get(field) == value -@pytest.mark.parametrize("name", ["test.mp3", "sample.flac"]) +@pytest.mark.parametrize("name", ["test.mp3", "sample.flac", "with_cover.ogg"]) def test_can_get_pictures(name): path = os.path.join(DATA_DIR, name) data = metadata.Metadata(path) @@ -243,3 +245,20 @@ def test_metadata_all_ignore_parse_errors_false(mocker): mocker.patch.object(data, "get", side_effect=metadata.ParseError("Failure")) with pytest.raises(metadata.ParseError): data.all(ignore_parse_errors=False) + + +def test_metadata_fallback_ogg_theora(mocker): + path = os.path.join(DATA_DIR, "with_cover.ogg") + data = metadata.Metadata(path) + + assert isinstance(data._file, mutagen.oggtheora.OggTheora) + assert isinstance(data.fallback, metadata.Metadata) + assert isinstance(data.fallback._file, mutagen.oggvorbis.OggVorbis) + + expected_result = data.fallback.get("pictures") + fallback_get = mocker.spy(data.fallback, "get") + + assert expected_result is not None + assert data.get("pictures", "default") == expected_result + + fallback_get.assert_called_once_with("pictures", "default") diff --git a/api/tests/music/with_cover.ogg b/api/tests/music/with_cover.ogg new file mode 100644 index 0000000000000000000000000000000000000000..ddd3ab7009e108474d6d15d08640672775b463a1 GIT binary patch literal 40414 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 lxE44t?6C=4$h0