Merge branch '782-artists-metadata' into 'develop'

Fix #782: Better handling of featuring/multi-artist tracks tagged with MusicBrainz

Closes #782

See merge request funkwhale/funkwhale!717
merge-requests/757/head
Eliot Berriot 2019-04-12 12:07:34 +02:00
commit 87c4774fc9
4 zmienionych plików z 48 dodań i 6 usunięć

Wyświetl plik

@ -381,18 +381,22 @@ class ArtistField(serializers.Field):
def to_internal_value(self, data):
# we have multiple values that can be separated by various separators
separators = [";", "/"]
separators = [";"]
# we get a list like that if tagged via musicbrainz
# ae29aae4-abfb-4609-8f54-417b1f4d64cc; 3237b5a8-ae44-400c-aa6d-cea51f0b9074;
raw_mbids = data["mbids"]
used_separator = None
mbids = [raw_mbids]
if raw_mbids:
for separator in separators:
if separator in raw_mbids:
used_separator = separator
mbids = [m.strip() for m in raw_mbids.split(separator)]
break
if "/" in raw_mbids:
# it's a featuring, we can't handle this now
mbids = []
else:
for separator in separators:
if separator in raw_mbids:
used_separator = separator
mbids = [m.strip() for m in raw_mbids.split(separator)]
break
# now, we split on artist names, using the same separator as the one used
# by mbids, if any

Wyświetl plik

@ -537,3 +537,18 @@ def test_serializer_album_artist_missing():
serializer = metadata.TrackMetadataSerializer(data=metadata.FakeMetadata(data))
assert serializer.is_valid(raise_exception=True) is True
assert serializer.validated_data == expected
def test_artist_field_featuring():
data = {
"artist": "Santana feat. Chris Cornell",
# here is the tricky bit, note the slash
"musicbrainz_artistid": "9a3bf45c-347d-4630-894d-7cf3e8e0b632/cbf9738d-8f81-4a92-bc64-ede09341652d",
}
expected = [{"name": "Santana feat. Chris Cornell", "mbid": None}]
field = metadata.ArtistField()
value = field.get_value(data)
assert field.to_internal_value(value) == expected

Wyświetl plik

@ -74,6 +74,28 @@ def test_can_create_track_from_file_metadata_attributed_to(factories, mocker):
assert track.artist.attributed_to == actor
def test_can_create_track_from_file_metadata_featuring(factories):
metadata = {
"title": "Whole Lotta Love",
"position": 1,
"disc_number": 1,
"mbid": "508704c0-81d4-4c94-ba58-3fc0b7da23eb",
"album": {
"title": "Guitar Heaven: The Greatest Guitar Classics of All Time",
"mbid": "d06f2072-4148-488d-af6f-69ab6539ddb8",
"release_date": datetime.date(2010, 9, 17),
"artists": [
{"name": "Santana", "mbid": "9a3bf45c-347d-4630-894d-7cf3e8e0b632"}
],
},
"artists": [{"name": "Santana feat. Chris Cornell", "mbid": None}],
}
track = tasks.get_track_from_import_metadata(metadata)
assert track.album.artist.name == "Santana"
assert track.artist.name == "Santana feat. Chris Cornell"
def test_can_create_track_from_file_metadata_mbid(factories, mocker):
metadata = {
"title": "Test track",

Wyświetl plik

@ -0,0 +1 @@
Better handling of featuring/multi-artist tracks tagged with MusicBrainz (#782)