From cdcba85f299096c243841829a9478f392a42b686 Mon Sep 17 00:00:00 2001
From: Eliot Berriot <contact@eliotberriot.com>
Date: Wed, 26 Jun 2019 10:38:29 +0200
Subject: [PATCH] Resolve "Importing tracks without album fails"

---
 api/funkwhale_api/music/metadata.py |  8 ++++++--
 api/tests/music/test_metadata.py    | 28 ++++++++++++++++++++++++++++
 changes/changelog.d/122.enhancement |  1 +
 3 files changed, 35 insertions(+), 2 deletions(-)
 create mode 100644 changes/changelog.d/122.enhancement

diff --git a/api/funkwhale_api/music/metadata.py b/api/funkwhale_api/music/metadata.py
index 55044dbc7f..f0ea67b1aa 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 52c4e30268..539fa49a2f 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 0000000000..2776824c74
--- /dev/null
+++ b/changes/changelog.d/122.enhancement
@@ -0,0 +1 @@
+Support for importing files with no album tag (#122)
-- 
GitLab