diff --git a/api/funkwhale_api/music/metadata.py b/api/funkwhale_api/music/metadata.py index 55044dbc7f98e88d2decc1c756a7f0488bcfdac9..f0ea67b1aa66003be34cd0572f6e79c10c8064f4 100644 --- a/api/funkwhale_api/music/metadata.py +++ b/api/funkwhale_api/music/metadata.py @@ -13,6 +13,8 @@ from rest_framework.compat import Mapping logger = logging.getLogger(__name__) NODEFAULT = object() +# default title used when imported tracks miss the `Album` tag, see #122 +UNKWOWN_ALBUM = "[Unknown Album]" class TagNotFound(KeyError): @@ -425,9 +427,11 @@ class AlbumField(serializers.Field): def to_internal_value(self, data): try: - title = data.get("album") + title = data.get("album") or "" except TagNotFound: - raise serializers.ValidationError("Missing album tag") + title = "" + + title = title.strip() or UNKWOWN_ALBUM final = { "title": title, "release_date": data.get("date", None), diff --git a/api/tests/music/test_metadata.py b/api/tests/music/test_metadata.py index 52c4e302685b7bf0aa178676f321c29bf551e1a8..539fa49a2f2b26a3a6818d2d4d23ace81f910122 100644 --- a/api/tests/music/test_metadata.py +++ b/api/tests/music/test_metadata.py @@ -539,6 +539,34 @@ def test_serializer_album_artist_missing(): assert serializer.validated_data == expected +@pytest.mark.parametrize( + "data", + [ + # no album tag + {"title": "Track", "artist": "Artist"}, + # empty/null values + {"title": "Track", "artist": "Artist", "album": ""}, + {"title": "Track", "artist": "Artist", "album": " "}, + {"title": "Track", "artist": "Artist", "album": None}, + ], +) +def test_serializer_album_default_title_when_missing_or_empty(data): + expected = { + "title": "Track", + "artists": [{"name": "Artist", "mbid": None}], + "album": { + "title": metadata.UNKWOWN_ALBUM, + "mbid": None, + "release_date": None, + "artists": [], + }, + "cover_data": None, + } + serializer = metadata.TrackMetadataSerializer(data=metadata.FakeMetadata(data)) + assert serializer.is_valid(raise_exception=True) is True + assert serializer.validated_data == expected + + @pytest.mark.parametrize( "field_name", ["copyright", "license", "mbid", "position", "disc_number"] ) diff --git a/changes/changelog.d/122.enhancement b/changes/changelog.d/122.enhancement new file mode 100644 index 0000000000000000000000000000000000000000..2776824c7406e3adb2af3bd77c3397ed0f0c7cac --- /dev/null +++ b/changes/changelog.d/122.enhancement @@ -0,0 +1 @@ +Support for importing files with no album tag (#122)