diff --git a/api/funkwhale_api/music/tasks.py b/api/funkwhale_api/music/tasks.py index 2d4e173d7..13baf36ca 100644 --- a/api/funkwhale_api/music/tasks.py +++ b/api/funkwhale_api/music/tasks.py @@ -247,6 +247,15 @@ def process_upload(upload, update_denormalization=True): return fail_import( upload, "invalid_metadata", detail=detail, file_metadata=metadata_dump ) + if ( + settings.ONLY_ALLOW_MUSICBRAINZ_TAGGED_FILES is True + and not serializer.validated_data.get("mbid") + ): + return fail_import( + upload, + "Uploading files without a MusicBrainz ID is not permitted in this pod", + detail="You can tag you files with MusicBrainz Picard", + ) final_metadata = collections.ChainMap( additional_data, serializer.validated_data, internal_config diff --git a/api/pyproject.toml b/api/pyproject.toml index ab2d6a47c..075e0e427 100644 --- a/api/pyproject.toml +++ b/api/pyproject.toml @@ -179,6 +179,7 @@ env = [ "DISABLE_PASSWORD_VALIDATORS=false", "FUNKWHALE_PLUGINS=", "MUSIC_DIRECTORY_PATH=/music", + "ONLY_ALLOW_MUSICBRAINZ_TAGGED_FILES=true", ] [tool.coverage.run] diff --git a/api/tests/music/test_tasks.py b/api/tests/music/test_tasks.py index 43bb87dd3..b11239083 100644 --- a/api/tests/music/test_tasks.py +++ b/api/tests/music/test_tasks.py @@ -1400,3 +1400,30 @@ def test_fs_import(factories, cache, mocker, settings): } assert cache.get("fs-import:status") == "finished" assert "Pruning dangling tracks" in cache.get("fs-import:logs")[-1] + + +def test_upload_checks_mbid_tag(temp_signal, factories, mocker): + mocker.patch("funkwhale_api.federation.routes.outbox.dispatch") + mocker.patch("funkwhale_api.music.tasks.populate_album_cover") + mocker.patch("funkwhale_api.music.metadata.Metadata.get_picture") + # mocker.spy(tasks, "get_track_from_import_metadata") + track = factories["music.Track"](album__attachment_cover=None, mbid=None) + path = os.path.join(DATA_DIR, "with_cover.opus") + + upload = factories["music.Upload"]( + track=None, + audio_file__from_path=path, + import_metadata={"funkwhale": {"track": {"uuid": str(track.uuid)}}}, + ) + mocker.patch("funkwhale_api.music.models.TrackActor.create_entries") + + with temp_signal(signals.upload_import_status_updated) as handler: + tasks.process_upload(upload_id=upload.pk) + + upload.refresh_from_db() + + assert upload.import_status == "errored" + assert upload.import_details == { + "error_code": "Uploading files without a MusicBrainz ID is not permitted in this pod", + "detail": "You can tag you files with MusicBrainz Picard", + }