diff --git a/api/funkwhale_api/music/serializers.py b/api/funkwhale_api/music/serializers.py index cf550524b..9c54a6f91 100644 --- a/api/funkwhale_api/music/serializers.py +++ b/api/funkwhale_api/music/serializers.py @@ -1,3 +1,5 @@ +import os +import pathlib import urllib.parse from django import urls @@ -884,13 +886,17 @@ class FSImportSerializer(serializers.Serializer): prune = serializers.BooleanField(required=False, default=True) outbox = serializers.BooleanField(required=False, default=False) broadcast = serializers.BooleanField(required=False, default=False) + replace = serializers.BooleanField(required=False, default=False) batch_size = serializers.IntegerField(required=False, default=1000) verbosity = serializers.IntegerField(required=False, default=1) def validate_path(self, value): try: utils.browse_dir(settings.MUSIC_DIRECTORY_PATH, value) - except (NotADirectoryError, FileNotFoundError, ValueError): + except NotADirectoryError: + if not os.path.isfile(pathlib.Path(settings.MUSIC_DIRECTORY_PATH) / value): + raise serializers.ValidationError("Invalid path") + except (FileNotFoundError, ValueError): raise serializers.ValidationError("Invalid path") return value diff --git a/api/funkwhale_api/music/tasks.py b/api/funkwhale_api/music/tasks.py index cc0fcaaf2..bf908cde8 100644 --- a/api/funkwhale_api/music/tasks.py +++ b/api/funkwhale_api/music/tasks.py @@ -1209,6 +1209,7 @@ def fs_import( prune=True, outbox=False, broadcast=False, + replace=False, batch_size=1000, verbosity=1, ): @@ -1229,7 +1230,7 @@ def fs_import( "batch_size": batch_size, "async_": False, "prune": prune, - "replace": False, + "replace": replace, "verbosity": verbosity, "exit_on_failure": False, "outbox": outbox, diff --git a/api/funkwhale_api/music/views.py b/api/funkwhale_api/music/views.py index 0e9420f9c..6b0aa9d55 100644 --- a/api/funkwhale_api/music/views.py +++ b/api/funkwhale_api/music/views.py @@ -386,6 +386,7 @@ class LibraryViewSet( prune=serializer.validated_data["prune"], outbox=serializer.validated_data["outbox"], broadcast=serializer.validated_data["broadcast"], + replace=serializer.validated_data["replace"], batch_size=serializer.validated_data["batch_size"], verbosity=serializer.validated_data["verbosity"], ) diff --git a/api/tests/music/test_views.py b/api/tests/music/test_views.py index dfef58a54..8a88481c8 100644 --- a/api/tests/music/test_views.py +++ b/api/tests/music/test_views.py @@ -1528,6 +1528,7 @@ def test_fs_import_post( prune=True, outbox=False, broadcast=False, + replace=False, batch_size=1000, verbosity=1, ) diff --git a/changes/changelog.d/2791.feature b/changes/changelog.d/2791.feature new file mode 100644 index 000000000..33b45ad2c --- /dev/null +++ b/changes/changelog.d/2791.feature @@ -0,0 +1 @@ +Allow importing single files using fs-import API endpoint