diff --git a/api/funkwhale_api/manage/serializers.py b/api/funkwhale_api/manage/serializers.py index c72e015bf..67e0178e0 100644 --- a/api/funkwhale_api/manage/serializers.py +++ b/api/funkwhale_api/manage/serializers.py @@ -44,12 +44,14 @@ class ManageUserSimpleSerializer(serializers.ModelSerializer): class ManageUserSerializer(serializers.ModelSerializer): permissions = PermissionsSerializer(source="*") upload_quota = serializers.IntegerField(allow_null=True) + actor = serializers.SerializerMethodField() class Meta: model = users_models.User fields = ( "id", "username", + "actor", "email", "name", "is_active", @@ -82,6 +84,10 @@ class ManageUserSerializer(serializers.ModelSerializer): ) return instance + def get_actor(self, obj): + if obj.actor: + return ManageBaseActorSerializer(obj.actor).data + class ManageInvitationSerializer(serializers.ModelSerializer): users = ManageUserSimpleSerializer(many=True, required=False) diff --git a/api/funkwhale_api/manage/views.py b/api/funkwhale_api/manage/views.py index fb9ceabc5..c788dd96b 100644 --- a/api/funkwhale_api/manage/views.py +++ b/api/funkwhale_api/manage/views.py @@ -291,7 +291,7 @@ class ManageUserViewSet( mixins.UpdateModelMixin, viewsets.GenericViewSet, ): - queryset = users_models.User.objects.all().order_by("-id") + queryset = users_models.User.objects.all().select_related("actor").order_by("-id") serializer_class = serializers.ManageUserSerializer filterset_class = filters.ManageUserFilterSet required_scope = "instance:users" diff --git a/api/funkwhale_api/music/metadata.py b/api/funkwhale_api/music/metadata.py index 55044dbc7..f0ea67b1a 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/funkwhale_api/music/utils.py b/api/funkwhale_api/music/utils.py index 571bc4ddd..84f55dda7 100644 --- a/api/funkwhale_api/music/utils.py +++ b/api/funkwhale_api/music/utils.py @@ -31,6 +31,7 @@ def compute_status(jobs): AUDIO_EXTENSIONS_AND_MIMETYPE = [ ("ogg", "audio/ogg"), + ("opus", "audio/opus"), ("mp3", "audio/mpeg"), ("flac", "audio/x-flac"), ("flac", "audio/flac"), diff --git a/api/tests/music/test_metadata.py b/api/tests/music/test_metadata.py index 52c4e3026..539fa49a2 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 000000000..2776824c7 --- /dev/null +++ b/changes/changelog.d/122.enhancement @@ -0,0 +1 @@ +Support for importing files with no album tag (#122) diff --git a/changes/changelog.d/868.enhancement b/changes/changelog.d/868.enhancement new file mode 100644 index 000000000..13fc39530 --- /dev/null +++ b/changes/changelog.d/868.enhancement @@ -0,0 +1 @@ +Added opus to the list of supported mimetypes and extensions (#868) diff --git a/changes/changelog.d/869.bugfix b/changes/changelog.d/869.bugfix new file mode 100644 index 000000000..7d56f3175 --- /dev/null +++ b/changes/changelog.d/869.bugfix @@ -0,0 +1 @@ +Fixed broken user admin for users with non-digit or letters in their username (#869) diff --git a/front/src/components/manage/users/UsersTable.vue b/front/src/components/manage/users/UsersTable.vue index ee1d3110b..a508f5be9 100644 --- a/front/src/components/manage/users/UsersTable.vue +++ b/front/src/components/manage/users/UsersTable.vue @@ -45,7 +45,8 @@