diff --git a/api/funkwhale_api/common/management/commands/script.py b/api/funkwhale_api/common/management/commands/script.py
index 03e32d5dd799a21ffe7e7d44280a53ec4befe778..b46a4327b0996a97aadd49a6b3066e99644c6e7c 100644
--- a/api/funkwhale_api/common/management/commands/script.py
+++ b/api/funkwhale_api/common/management/commands/script.py
@@ -41,7 +41,6 @@ class Command(BaseCommand):
         script["entrypoint"](self, **options)
 
     def show_help(self):
-        indentation = 4
         self.stdout.write("")
         self.stdout.write("Available scripts:")
         self.stdout.write("Launch with: python manage.py <script_name>")
diff --git a/api/funkwhale_api/common/serializers.py b/api/funkwhale_api/common/serializers.py
index 8cc85ec0c9cb75e433952fe44fd145c3a0f2a667..029338ef992c6a57e3d88f096d4c7619df39d63b 100644
--- a/api/funkwhale_api/common/serializers.py
+++ b/api/funkwhale_api/common/serializers.py
@@ -40,7 +40,6 @@ class ActionSerializer(serializers.Serializer):
         return value
 
     def validate_objects(self, value):
-        qs = None
         if value == "all":
             return self.queryset.all().order_by("id")
         if type(value) in [list, tuple]:
diff --git a/api/funkwhale_api/downloader/downloader.py b/api/funkwhale_api/downloader/downloader.py
index 3599b86ef1861e590caa63622526c72f71fafbaf..41ae7299582a43f9e5b3326da1e0262188de3bac 100644
--- a/api/funkwhale_api/downloader/downloader.py
+++ b/api/funkwhale_api/downloader/downloader.py
@@ -1,9 +1,6 @@
 import os
-import json
-from urllib.parse import quote_plus
 import youtube_dl
 from django.conf import settings
-import glob
 
 
 def download(
diff --git a/api/funkwhale_api/federation/actors.py b/api/funkwhale_api/federation/actors.py
index 32b54565669a9574e90e29f34ec750b35ceec26f..c6c3bd8167297f6743a2b2a0ebd6525aece56bf2 100644
--- a/api/funkwhale_api/federation/actors.py
+++ b/api/funkwhale_api/federation/actors.py
@@ -1,6 +1,5 @@
 import datetime
 import logging
-import uuid
 import xml
 
 from django.conf import settings
@@ -155,7 +154,6 @@ class SystemActor(object):
         return handler(data, actor)
 
     def handle_follow(self, ac, sender):
-        system_actor = self.get_actor_instance()
         serializer = serializers.FollowSerializer(
             data=ac, context={"follow_actor": sender}
         )
@@ -325,7 +323,6 @@ class TestActor(SystemActor):
         reply_url = "https://{}/activities/note/{}".format(
             settings.FEDERATION_HOSTNAME, now.timestamp()
         )
-        reply_content = "{} Pong!".format(sender.mention_username)
         reply_activity = {
             "@context": [
                 "https://www.w3.org/ns/activitystreams",
diff --git a/api/funkwhale_api/federation/serializers.py b/api/funkwhale_api/federation/serializers.py
index 367ca99296f546040c9496b4bd62a1452185b086..51ae39f0d54c12cdfbdf221969cc747be4e61d45 100644
--- a/api/funkwhale_api/federation/serializers.py
+++ b/api/funkwhale_api/federation/serializers.py
@@ -687,7 +687,7 @@ class AudioSerializer(serializers.Serializer):
 
     def validate_url(self, v):
         try:
-            url = v["href"]
+            v["href"]
         except (KeyError, TypeError):
             raise serializers.ValidationError("Missing href")
 
diff --git a/api/funkwhale_api/federation/signing.py b/api/funkwhale_api/federation/signing.py
index 46e7ae55a38eaf82a0e207ffccba78fd86462bab..bb02f042b43945359adb3530d0bb13f21ef31502 100644
--- a/api/funkwhale_api/federation/signing.py
+++ b/api/funkwhale_api/federation/signing.py
@@ -47,7 +47,7 @@ def verify_django(django_request, public_key):
         v = request.headers[h]
         if v:
             request.headers[h] = str(v)
-    prepared_request = request.prepare()
+    request.prepare()
     return verify(request, public_key)
 
 
diff --git a/api/funkwhale_api/federation/views.py b/api/funkwhale_api/federation/views.py
index 36bf1a4443653a48001d94e5a7a4f8ff43687289..87564b507208c92da2eb92ff7a3016a08a175b6a 100644
--- a/api/funkwhale_api/federation/views.py
+++ b/api/funkwhale_api/federation/views.py
@@ -249,7 +249,7 @@ class LibraryViewSet(
     def create(self, request, *args, **kwargs):
         serializer = serializers.APILibraryCreateSerializer(data=request.data)
         serializer.is_valid(raise_exception=True)
-        library = serializer.save()
+        serializer.save()
         return response.Response(serializer.data, status=201)
 
 
diff --git a/api/funkwhale_api/instance/nodeinfo.py b/api/funkwhale_api/instance/nodeinfo.py
index ea982a63fea5f8ae5037c4f40cf7da3b49fc8625..9077a34bc889e0afba9b3b13fec326a7f4afd51d 100644
--- a/api/funkwhale_api/instance/nodeinfo.py
+++ b/api/funkwhale_api/instance/nodeinfo.py
@@ -12,7 +12,6 @@ memo = memoize.Memoizer(store, namespace="instance:stats")
 
 def get():
     share_stats = preferences.get("instance__nodeinfo_stats_enabled")
-    private = preferences.get("instance__nodeinfo_private")
     data = {
         "version": "2.0",
         "software": {"name": "funkwhale", "version": funkwhale_api.__version__},
diff --git a/api/funkwhale_api/music/lyrics.py b/api/funkwhale_api/music/lyrics.py
index 4fd31d92cd13f46a87c12fb34576076bc8a933cd..2cf1cff75af7c7d3aed8543cc1350de4e5c5e1ed 100644
--- a/api/funkwhale_api/music/lyrics.py
+++ b/api/funkwhale_api/music/lyrics.py
@@ -1,5 +1,4 @@
 import urllib.request
-import html.parser
 from bs4 import BeautifulSoup
 
 
diff --git a/api/funkwhale_api/music/management/commands/fix_track_files.py b/api/funkwhale_api/music/management/commands/fix_track_files.py
index 94dd4fb9f74f73740b4cec8c30cccc5526cca940..8f6e4e61d954f14bf5e5e153b964a231621719a4 100644
--- a/api/funkwhale_api/music/management/commands/fix_track_files.py
+++ b/api/funkwhale_api/music/management/commands/fix_track_files.py
@@ -1,5 +1,4 @@
 import cacheops
-import os
 
 from django.db import transaction
 from django.db.models import Q
diff --git a/api/funkwhale_api/music/migrations/0011_rename_files.py b/api/funkwhale_api/music/migrations/0011_rename_files.py
index 7152cca3b15942bb87ed82bc1c4d252a416632d9..2b120370cdd90dc7706f819906d7247d67d64328 100644
--- a/api/funkwhale_api/music/migrations/0011_rename_files.py
+++ b/api/funkwhale_api/music/migrations/0011_rename_files.py
@@ -1,6 +1,5 @@
 # -*- coding: utf-8 -*-
 from __future__ import unicode_literals
-import os
 
 from django.db import migrations, models
 from funkwhale_api.common.utils import rename_file
diff --git a/api/funkwhale_api/music/migrations/0015_bind_track_file_to_import_job.py b/api/funkwhale_api/music/migrations/0015_bind_track_file_to_import_job.py
index 9762864f1e74af30586f7f7b578f5436e4931f7f..6806ea8cad08d581e1ce791c8851b23d972c5fa6 100644
--- a/api/funkwhale_api/music/migrations/0015_bind_track_file_to_import_job.py
+++ b/api/funkwhale_api/music/migrations/0015_bind_track_file_to_import_job.py
@@ -1,6 +1,5 @@
 # -*- coding: utf-8 -*-
 from __future__ import unicode_literals
-import os
 
 from django.db import migrations, models
 from funkwhale_api.common.utils import rename_file
diff --git a/api/funkwhale_api/music/migrations/0019_populate_mimetypes.py b/api/funkwhale_api/music/migrations/0019_populate_mimetypes.py
index 55f9a127ad5e82f1637234b3db37a038ca67c36f..b3fac0d93e7d0b1f15582f79e0feb7c4310aafe0 100644
--- a/api/funkwhale_api/music/migrations/0019_populate_mimetypes.py
+++ b/api/funkwhale_api/music/migrations/0019_populate_mimetypes.py
@@ -1,6 +1,5 @@
 # -*- coding: utf-8 -*-
 from __future__ import unicode_literals
-import os
 
 from django.db import migrations, models
 from funkwhale_api.music.utils import guess_mimetype
diff --git a/api/funkwhale_api/music/migrations/0021_populate_batch_status.py b/api/funkwhale_api/music/migrations/0021_populate_batch_status.py
index 5bda0edfbdee319417265340395c3eea50544a44..25149bda19080de2bbb9b489bbae161fdda63b88 100644
--- a/api/funkwhale_api/music/migrations/0021_populate_batch_status.py
+++ b/api/funkwhale_api/music/migrations/0021_populate_batch_status.py
@@ -1,6 +1,5 @@
 # -*- coding: utf-8 -*-
 from __future__ import unicode_literals
-import os
 
 from django.db import migrations, models
 
diff --git a/api/funkwhale_api/music/migrations/0024_populate_uuid.py b/api/funkwhale_api/music/migrations/0024_populate_uuid.py
index 349a901fc4ca3b214877a5b520bcfb2c9584b818..63ab6386257bdbd3dc51a9b57ffbbbacc4208286 100644
--- a/api/funkwhale_api/music/migrations/0024_populate_uuid.py
+++ b/api/funkwhale_api/music/migrations/0024_populate_uuid.py
@@ -1,6 +1,5 @@
 # -*- coding: utf-8 -*-
 from __future__ import unicode_literals
-import os
 import uuid
 from django.db import migrations, models
 
diff --git a/api/funkwhale_api/music/models.py b/api/funkwhale_api/music/models.py
index d4625a435f6c84d48bcb2b94d6f67ed838b15eca..95056738fca67b7556b9482d98f6b49120d0af93 100644
--- a/api/funkwhale_api/music/models.py
+++ b/api/funkwhale_api/music/models.py
@@ -1,5 +1,4 @@
 import os
-import io
 import arrow
 import datetime
 import tempfile
diff --git a/api/funkwhale_api/music/views.py b/api/funkwhale_api/music/views.py
index 15421fa3811ab2e32c13d5e43bcd013ecac222f8..6c916b62d147b4787a9328e069fda26ee822885d 100644
--- a/api/funkwhale_api/music/views.py
+++ b/api/funkwhale_api/music/views.py
@@ -1,8 +1,6 @@
 import ffmpeg
-import os
 import json
 import logging
-import subprocess
 import unicodedata
 import urllib
 
diff --git a/api/funkwhale_api/providers/audiofile/management/commands/import_files.py b/api/funkwhale_api/providers/audiofile/management/commands/import_files.py
index 9114375e0745d42d1fd9c6cbb013c746b8144258..45b428790f373e9635237dc35634700ecd79128c 100644
--- a/api/funkwhale_api/providers/audiofile/management/commands/import_files.py
+++ b/api/funkwhale_api/providers/audiofile/management/commands/import_files.py
@@ -178,7 +178,6 @@ class Command(BaseCommand):
         async = options["async"]
         import_handler = tasks.import_job_run.delay if async else tasks.import_job_run
         batch = user.imports.create(source="shell")
-        total = len(paths)
         errors = []
         for i, path in list(enumerate(paths)):
             try:
diff --git a/api/funkwhale_api/providers/audiofile/tasks.py b/api/funkwhale_api/providers/audiofile/tasks.py
index afd54dc24b18437e591c815080cca5081465a778..a4426a0093b857109d76cb473b8c7008556b03c1 100644
--- a/api/funkwhale_api/providers/audiofile/tasks.py
+++ b/api/funkwhale_api/providers/audiofile/tasks.py
@@ -1,6 +1,5 @@
 import acoustid
 import os
-import datetime
 from django.core.files import File
 from django.db import transaction
 
diff --git a/api/funkwhale_api/radios/radios.py b/api/funkwhale_api/radios/radios.py
index f876d03b28730145db23a244fd1890dc51912722..7e3c1ab5ad3ecaf8f5bfcdb7b287388d8585f1ed 100644
--- a/api/funkwhale_api/radios/radios.py
+++ b/api/funkwhale_api/radios/radios.py
@@ -147,7 +147,7 @@ class TagRadio(RelatedObjectRadio):
 
     def get_queryset(self, **kwargs):
         qs = super().get_queryset(**kwargs)
-        return Track.objects.filter(tags__in=[self.session.related_object])
+        return qs.filter(tags__in=[self.session.related_object])
 
 
 @registry.register(name="artist")
diff --git a/api/funkwhale_api/radios/views.py b/api/funkwhale_api/radios/views.py
index 1d933a2939ea95cb375f60c7368ca6504a2f71ca..8478f49e07616a23d4cdfcf4107d67481aaa7c71 100644
--- a/api/funkwhale_api/radios/views.py
+++ b/api/funkwhale_api/radios/views.py
@@ -108,7 +108,7 @@ class RadioSessionTrackViewSet(mixins.CreateModelMixin, viewsets.GenericViewSet)
             assert request.user == session.user
         except AssertionError:
             return Response(status=status.HTTP_403_FORBIDDEN)
-        track = session.radio.pick()
+        session.radio.pick()
         session_track = session.session_tracks.all().latest("id")
         # self.perform_create(serializer)
         # dirty override here, since we use a different serializer for creation and detail
diff --git a/api/funkwhale_api/subsonic/negotiation.py b/api/funkwhale_api/subsonic/negotiation.py
index 2b46b1753006f202d8a633fa461ad0b43f16b40b..4198756eddb04ef8486f8070e01f4c09643e5296 100644
--- a/api/funkwhale_api/subsonic/negotiation.py
+++ b/api/funkwhale_api/subsonic/negotiation.py
@@ -12,7 +12,6 @@ MAPPING = {
 
 class SubsonicContentNegociation(negotiation.DefaultContentNegotiation):
     def select_renderer(self, request, renderers, format_suffix=None):
-        path = request.path
         data = request.GET or request.POST
         requested_format = data.get("f", "xml")
         try:
diff --git a/api/funkwhale_api/subsonic/views.py b/api/funkwhale_api/subsonic/views.py
index 85d120a08640b506d7223d5ea4699b308967c8a1..e6fc2df712fa2f5e563f4519d075c0aeaccb779f 100644
--- a/api/funkwhale_api/subsonic/views.py
+++ b/api/funkwhale_api/subsonic/views.py
@@ -158,7 +158,6 @@ class SubsonicViewSet(viewsets.GenericViewSet):
     )
     @find_object(music_models.Artist.objects.all())
     def get_artist_info2(self, request, *args, **kwargs):
-        artist = kwargs.pop("obj")
         payload = {"artist-info2": {}}
 
         return response.Response(payload, status=200)
diff --git a/api/tests/activity/test_views.py b/api/tests/activity/test_views.py
index 188039e664db3e89e8a2da6ff0d7d7bc1c509056..6f13c828710fd7255c06be542efdd6510a7ed7cc 100644
--- a/api/tests/activity/test_views.py
+++ b/api/tests/activity/test_views.py
@@ -7,7 +7,7 @@ from funkwhale_api.activity import utils
 def test_activity_view(factories, api_client, preferences, anonymous_user):
     preferences["common__api_authentication_required"] = False
     favorite = factories["favorites.TrackFavorite"](user__privacy_level="everyone")
-    listening = factories["history.Listening"]()
+    factories["history.Listening"]()
     url = reverse("api:v1:activity-list")
     objects = utils.get_activity(anonymous_user)
     serializer = serializers.AutoSerializer(objects, many=True)
diff --git a/api/tests/common/test_preferences.py b/api/tests/common/test_preferences.py
index 5ea398c87fbeb75ae4f1c2a72adcef4d61205c06..d9b53b29b9fcbefde642ccd509f859ea19233880 100644
--- a/api/tests/common/test_preferences.py
+++ b/api/tests/common/test_preferences.py
@@ -26,14 +26,14 @@ def string_list_pref(preferences):
     ],
 )
 def test_string_list_serializer_to_db(input, output):
-    s = common_preferences.StringListSerializer.to_db(input) == output
+    common_preferences.StringListSerializer.to_db(input) == output
 
 
 @pytest.mark.parametrize(
     "input,output", [("a,b,c", ["a", "b", "c"]), (None, []), ("", [])]
 )
 def test_string_list_serializer_to_python(input, output):
-    s = common_preferences.StringListSerializer.to_python(input) == output
+    common_preferences.StringListSerializer.to_python(input) == output
 
 
 def test_string_list_pref_default(string_list_pref, preferences):
diff --git a/api/tests/common/test_serializers.py b/api/tests/common/test_serializers.py
index 1bf13b1e0243a5d36637e3e158cbef9ab62bac14..ca5e5ad8f6fd2317af880eef0aec3f28b1184b04 100644
--- a/api/tests/common/test_serializers.py
+++ b/api/tests/common/test_serializers.py
@@ -47,7 +47,7 @@ def test_action_serializer_validates_objects():
 
 def test_action_serializers_objects_clean_ids(factories):
     user1 = factories["users.User"]()
-    user2 = factories["users.User"]()
+    factories["users.User"]()
 
     data = {"objects": [user1.pk], "action": "test"}
     serializer = TestSerializer(data, queryset=models.User.objects.all())
@@ -69,8 +69,8 @@ def test_action_serializers_objects_clean_all(factories):
 
 def test_action_serializers_save(factories, mocker):
     handler = mocker.spy(TestSerializer, "handle_test")
-    user1 = factories["users.User"]()
-    user2 = factories["users.User"]()
+    factories["users.User"]()
+    factories["users.User"]()
 
     data = {"objects": "all", "action": "test"}
     serializer = TestSerializer(data, queryset=models.User.objects.all())
@@ -82,7 +82,7 @@ def test_action_serializers_save(factories, mocker):
 
 
 def test_action_serializers_filterset(factories):
-    user1 = factories["users.User"](is_active=False)
+    factories["users.User"](is_active=False)
     user2 = factories["users.User"](is_active=True)
 
     data = {"objects": "all", "action": "test", "filters": {"is_active": True}}
diff --git a/api/tests/conftest.py b/api/tests/conftest.py
index 080e1a927a61b74188a5b15b927bc3de97e541a5..787831b0042ec8e2e657149d9ee305fc70efde1e 100644
--- a/api/tests/conftest.py
+++ b/api/tests/conftest.py
@@ -186,7 +186,6 @@ def fake_request():
 
 @pytest.fixture
 def activity_registry():
-    r = record.registry
     state = list(record.registry.items())
     yield record.registry
     record.registry.clear()
diff --git a/api/tests/federation/test_activity.py b/api/tests/federation/test_activity.py
index 8e9000ce013cf21c1df7bc3545d9e064e460002c..78ad389d1162b39a8013b3f5678d02699f159ab1 100644
--- a/api/tests/federation/test_activity.py
+++ b/api/tests/federation/test_activity.py
@@ -1,4 +1,3 @@
-import uuid
 
 from funkwhale_api.federation import activity
 from funkwhale_api.federation import serializers
diff --git a/api/tests/federation/test_actors.py b/api/tests/federation/test_actors.py
index 99c71b34820ac8f9f6f0656464d3436547f74940..f978079dc5c6f1362280850a58d7fe2108749d00 100644
--- a/api/tests/federation/test_actors.py
+++ b/api/tests/federation/test_actors.py
@@ -1,6 +1,5 @@
 import arrow
 import pytest
-import uuid
 
 from django.urls import reverse
 from django.utils import timezone
@@ -350,7 +349,7 @@ def test_library_actor_handles_follow_manual_approval(preferences, mocker, facto
 def test_library_actor_handles_follow_auto_approval(preferences, mocker, factories):
     preferences["federation__music_needs_approval"] = False
     actor = factories["federation.Actor"]()
-    accept_follow = mocker.patch("funkwhale_api.federation.activity.accept_follow")
+    mocker.patch("funkwhale_api.federation.activity.accept_follow")
     library_actor = actors.SYSTEM_ACTORS["library"].get_actor_instance()
     data = {
         "actor": actor.url,
diff --git a/api/tests/federation/test_models.py b/api/tests/federation/test_models.py
index be353cb670a3e7c2103a056559923c532561ecc2..c5defcfee3945b32548b1e0e69480bd8e6dd9cff 100644
--- a/api/tests/federation/test_models.py
+++ b/api/tests/federation/test_models.py
@@ -1,5 +1,4 @@
 import pytest
-import uuid
 
 from django import db
 
diff --git a/api/tests/federation/test_signing.py b/api/tests/federation/test_signing.py
index e88425e8f35de101a6d78a5b87e9f7227f57fcf3..1ebaaf82626ec3b83ec4e45f0483e5bfd86a9e1a 100644
--- a/api/tests/federation/test_signing.py
+++ b/api/tests/federation/test_signing.py
@@ -1,5 +1,4 @@
 import cryptography.exceptions
-import io
 import pytest
 import requests_http_signature
 
diff --git a/api/tests/federation/test_views.py b/api/tests/federation/test_views.py
index 2b0e47cdb112911fb66ccfba681afb229d60cdcf..e277fd0f3dfeb9ad2e3bfb9814f9b1f5bb0ff6c8 100644
--- a/api/tests/federation/test_views.py
+++ b/api/tests/federation/test_views.py
@@ -159,7 +159,6 @@ def test_audio_file_list_actor_page_exclude_federated_files(
     db, preferences, api_client, factories
 ):
     preferences["federation__music_needs_approval"] = False
-    library = actors.SYSTEM_ACTORS["library"].get_actor_instance()
     tfs = factories["music.TrackFile"].create_batch(size=5, federation=True)
 
     url = reverse("federation:music:files-list")
@@ -188,7 +187,6 @@ def test_audio_file_list_actor_page_error_too_far(
 
 
 def test_library_actor_includes_library_link(db, preferences, api_client):
-    actor = actors.SYSTEM_ACTORS["library"].get_actor_instance()
     url = reverse("federation:instance-actors-detail", kwargs={"actor": "library"})
     response = api_client.get(url)
     expected_links = [
@@ -263,7 +261,7 @@ def test_follow_library(superuser_api_client, mocker, factories, r_mock):
 def test_can_list_system_actor_following(factories, superuser_api_client):
     library_actor = actors.SYSTEM_ACTORS["library"].get_actor_instance()
     follow1 = factories["federation.Follow"](actor=library_actor)
-    follow2 = factories["federation.Follow"]()
+    factories["federation.Follow"]()
 
     url = reverse("api:v1:federation:libraries-following")
     response = superuser_api_client.get(url)
diff --git a/api/tests/history/test_history.py b/api/tests/history/test_history.py
index 016c2a98786b4c5dc4b2520f99e95bb1bf85d607..e43e79ba70e0ae54558cf0eb1a0e0a47d41c85cc 100644
--- a/api/tests/history/test_history.py
+++ b/api/tests/history/test_history.py
@@ -1,5 +1,3 @@
-import random
-import json
 from django.urls import reverse
 from django.core.exceptions import ValidationError
 from django.utils import timezone
@@ -10,7 +8,6 @@ from funkwhale_api.history import models
 def test_can_create_listening(factories):
     track = factories["music.Track"]()
     user = factories["users.User"]()
-    now = timezone.now()
     l = models.Listening.objects.create(user=user, track=track)
 
 
diff --git a/api/tests/music/test_commands.py b/api/tests/music/test_commands.py
index 9f8bad6c290c70e8a33de43ede924e9f2292c8f2..03a9420dc77e598231fe0ac9056bea67868a3897 100644
--- a/api/tests/music/test_commands.py
+++ b/api/tests/music/test_commands.py
@@ -49,7 +49,6 @@ def test_fix_track_files_size(factories, mocker):
 
 
 def test_fix_track_files_mimetype(factories, mocker):
-    name = "test.mp3"
     mp3_path = os.path.join(DATA_DIR, "test.mp3")
     ogg_path = os.path.join(DATA_DIR, "test.ogg")
     tf1 = factories["music.TrackFile"](
diff --git a/api/tests/music/test_import.py b/api/tests/music/test_import.py
index 9ea8c4ec8505e058b8fe001491dea3edd02143f6..aae3583ed4fe753e0667f37f61101ae7e2f000e2 100644
--- a/api/tests/music/test_import.py
+++ b/api/tests/music/test_import.py
@@ -195,7 +195,7 @@ def test_import_batch_notifies_followers(factories, mocker):
 
     f1 = factories["federation.Follow"](approved=True, target=library_actor)
     f2 = factories["federation.Follow"](approved=False, target=library_actor)
-    f3 = factories["federation.Follow"]()
+    factories["federation.Follow"]()
 
     mocked_deliver = mocker.patch("funkwhale_api.federation.activity.deliver")
     batch = factories["music.ImportBatch"]()
diff --git a/api/tests/music/test_lyrics.py b/api/tests/music/test_lyrics.py
index c15e3063732ce8b7ebab850a723eef16d26415b8..5d97c7ae206125f26f9a13806829d4d1a82cc153 100644
--- a/api/tests/music/test_lyrics.py
+++ b/api/tests/music/test_lyrics.py
@@ -1,4 +1,3 @@
-import json
 from django.urls import reverse
 
 from funkwhale_api.music import models
diff --git a/api/tests/music/test_tasks.py b/api/tests/music/test_tasks.py
index 1d35e75e29a7adf4c1b90199ee0c6696e90326c9..f38f4143918b2b511eab732a0e4ee3e756dfa656 100644
--- a/api/tests/music/test_tasks.py
+++ b/api/tests/music/test_tasks.py
@@ -44,7 +44,6 @@ def test_set_acoustid_on_track_file(factories, mocker, preferences):
 
 def test_set_acoustid_on_track_file_required_high_score(factories, mocker):
     track_file = factories["music.TrackFile"](acoustid_track_id=None)
-    id = "e475bf79-c1ce-4441-bed7-1e33f226c0a2"
     payload = {"results": [{"score": 0.79}], "status": "ok"}
     m = mocker.patch("acoustid.match", return_value=payload)
     r = tasks.set_acoustid_on_track_file(track_file_id=track_file.pk)
@@ -159,7 +158,6 @@ def test_import_job_skip_if_already_exists(artists, albums, tracks, factories, m
     )
 
     job = factories["music.FileImportJob"](audio_file__path=path)
-    f = job.audio_file
     tasks.import_job_run(import_job_id=job.pk)
     job.refresh_from_db()
 
@@ -219,7 +217,6 @@ def test_update_album_cover_mbid(factories, mocker):
 
 
 def test_update_album_cover_file_data(factories, mocker):
-    path = os.path.join(DATA_DIR, "test.mp3")
     album = factories["music.Album"](cover="", mbid=None)
     tf = factories["music.TrackFile"](track__album=album)
 
@@ -236,7 +233,6 @@ def test_update_album_cover_file_data(factories, mocker):
 @pytest.mark.parametrize("ext,mimetype", [("jpg", "image/jpeg"), ("png", "image/png")])
 def test_update_album_cover_file_cover_separate_file(ext, mimetype, factories, mocker):
     mocker.patch("funkwhale_api.music.tasks.IMAGE_TYPES", [(ext, mimetype)])
-    path = os.path.join(DATA_DIR, "test.mp3")
     image_path = os.path.join(DATA_DIR, "cover.{}".format(ext))
     with open(image_path, "rb") as f:
         image_content = f.read()
diff --git a/api/tests/music/test_views.py b/api/tests/music/test_views.py
index 139a33cf5dbd70dd206db56805a45b3a484fccf6..840dd966633bd6d6cf4169739d39a1ed8e49f042 100644
--- a/api/tests/music/test_views.py
+++ b/api/tests/music/test_views.py
@@ -334,7 +334,7 @@ def test_import_job_viewset_get_queryset_upload_filters_user(
     logged_in_api_client.user.permission_upload = True
     logged_in_api_client.user.save()
 
-    job = factories["music.ImportJob"]()
+    factories["music.ImportJob"]()
     url = reverse("api:v1:import-jobs-list")
     response = logged_in_api_client.get(url)
 
@@ -347,7 +347,7 @@ def test_import_batch_viewset_get_queryset_upload_filters_user(
     logged_in_api_client.user.permission_upload = True
     logged_in_api_client.user.save()
 
-    job = factories["music.ImportBatch"]()
+    factories["music.ImportBatch"]()
     url = reverse("api:v1:import-batches-list")
     response = logged_in_api_client.get(url)
 
diff --git a/api/tests/music/test_works.py b/api/tests/music/test_works.py
index 6b2e57fdc908260178c36a76f0a60a765ce1446a..0d3c11ff0d1458321950c2810cc6ff40b4f6b033 100644
--- a/api/tests/music/test_works.py
+++ b/api/tests/music/test_works.py
@@ -1,4 +1,3 @@
-import json
 from django.urls import reverse
 
 from funkwhale_api.music import models
diff --git a/api/tests/musicbrainz/test_api.py b/api/tests/musicbrainz/test_api.py
index de84813f1f147b91a7198624df85f9742f88db58..a9f76890ee62a493187bf080d37d8ca9d5f74056 100644
--- a/api/tests/musicbrainz/test_api.py
+++ b/api/tests/musicbrainz/test_api.py
@@ -1,4 +1,3 @@
-import json
 from django.urls import reverse
 
 from funkwhale_api.musicbrainz import api
diff --git a/api/tests/playlists/test_serializers.py b/api/tests/playlists/test_serializers.py
index 05e5bd7cab4e46e828598515f91d349c32b83757..3a8bb6a22951dbac115114b01416c591765e7f61 100644
--- a/api/tests/playlists/test_serializers.py
+++ b/api/tests/playlists/test_serializers.py
@@ -53,7 +53,7 @@ def test_update_insert_is_called_when_index_is_provided(factories, mocker):
     second = factories["playlists.PlaylistTrack"](playlist=playlist, index=1)
     insert = mocker.spy(models.Playlist, "insert")
     factories["playlists.Playlist"]()
-    track = factories["music.Track"]()
+    factories["music.Track"]()
     serializer = serializers.PlaylistTrackWriteSerializer(
         second, data={"playlist": playlist.pk, "track": second.track.pk, "index": 0}
     )
diff --git a/api/tests/playlists/test_views.py b/api/tests/playlists/test_views.py
index 7835a72588a7345b6cbececc3b3660e62ca53a2d..2cb1184721207f0e2c2d9fa7b7f77b688974efcb 100644
--- a/api/tests/playlists/test_views.py
+++ b/api/tests/playlists/test_views.py
@@ -1,4 +1,3 @@
-import json
 import pytest
 
 from django.urls import reverse
@@ -13,7 +12,7 @@ def test_can_create_playlist_via_api(logged_in_api_client):
     url = reverse("api:v1:playlists-list")
     data = {"name": "test", "privacy_level": "everyone"}
 
-    response = logged_in_api_client.post(url, data)
+    logged_in_api_client.post(url, data)
 
     playlist = logged_in_api_client.user.playlists.latest("id")
     assert playlist.name == "test"
@@ -38,7 +37,7 @@ def test_playlist_inherits_user_privacy(logged_in_api_client):
 
     data = {"name": "test"}
 
-    response = logged_in_api_client.post(url, data)
+    logged_in_api_client.post(url, data)
     playlist = user.playlists.latest("id")
     assert playlist.privacy_level == user.privacy_level
 
@@ -80,7 +79,7 @@ def test_only_can_add_track_on_own_playlist_via_api(factories, logged_in_api_cli
 
 def test_deleting_plt_updates_indexes(mocker, factories, logged_in_api_client):
     remove = mocker.spy(models.Playlist, "remove")
-    track = factories["music.Track"]()
+    factories["music.Track"]()
     plt = factories["playlists.PlaylistTrack"](
         index=0, playlist__user=logged_in_api_client.user
     )
diff --git a/api/tests/radios/test_filters.py b/api/tests/radios/test_filters.py
index 025fc7a636ba074763b644dfa55b33e9880402ad..4b91f16384c18bf13820a3d32ae4cb3925cfa270 100644
--- a/api/tests/radios/test_filters.py
+++ b/api/tests/radios/test_filters.py
@@ -15,7 +15,7 @@ class NoopFilter(filters.RadioFilter):
 
 
 def test_most_simple_radio_does_not_filter_anything(factories):
-    tracks = factories["music.Track"].create_batch(3)
+    factories["music.Track"].create_batch(3)
     radio = factories["radios.Radio"](config=[{"type": "noop"}])
 
     assert radio.version == 0
diff --git a/api/tests/radios/test_radios.py b/api/tests/radios/test_radios.py
index ebc45f1f9415c4675b088ab6ebdfd69ff99209fe..95fe58b178f38293fa0e3255ce1b3bc62c21c2bb 100644
--- a/api/tests/radios/test_radios.py
+++ b/api/tests/radios/test_radios.py
@@ -75,7 +75,6 @@ def test_can_get_choices_for_custom_radio(factories):
     files = factories["music.TrackFile"].create_batch(5, track__artist=artist)
     tracks = [f.track for f in files]
     wrong_files = factories["music.TrackFile"].create_batch(5)
-    wrong_tracks = [f.track for f in wrong_files]
 
     session = factories["radios.CustomRadioSession"](
         custom_radio__config=[{"type": "artist", "ids": [artist.pk]}]
@@ -115,13 +114,12 @@ def test_can_start_custom_radio_from_api(logged_in_client, factories):
 
 def test_can_use_radio_session_to_filter_choices(factories):
     files = factories["music.TrackFile"].create_batch(30)
-    tracks = [f.track for f in files]
     user = factories["users.User"]()
     radio = radios.RandomRadio()
     session = radio.start_session(user)
 
     for i in range(30):
-        p = radio.pick()
+        radio.pick()
 
     # ensure 30 differents tracks have been suggested
     tracks_id = [
@@ -186,7 +184,6 @@ def test_can_start_artist_radio(factories):
     user = factories["users.User"]()
     artist = factories["music.Artist"]()
     wrong_files = factories["music.TrackFile"].create_batch(5)
-    wrong_tracks = [f.track for f in wrong_files]
     good_files = factories["music.TrackFile"].create_batch(5, track__artist=artist)
     good_tracks = [f.track for f in good_files]
 
@@ -201,7 +198,6 @@ def test_can_start_tag_radio(factories):
     user = factories["users.User"]()
     tag = factories["taggit.Tag"]()
     wrong_files = factories["music.TrackFile"].create_batch(5)
-    wrong_tracks = [f.track for f in wrong_files]
     good_files = factories["music.TrackFile"].create_batch(5, track__tags=[tag])
     good_tracks = [f.track for f in good_files]
 
@@ -236,7 +232,7 @@ def test_can_start_less_listened_radio(factories):
     good_files = factories["music.TrackFile"].create_batch(5)
     good_tracks = [f.track for f in good_files]
     radio = radios.LessListenedRadio()
-    session = radio.start_session(user)
+    radio.start_session(user)
 
     for i in range(5):
         assert radio.pick() in good_tracks
diff --git a/api/tests/subsonic/test_authentication.py b/api/tests/subsonic/test_authentication.py
index f404c8b0ab3ac9c1d5e6c35e7cd80886df304e0b..03a863ca09164fa25aed2aa2eb5efc2b8068c390 100644
--- a/api/tests/subsonic/test_authentication.py
+++ b/api/tests/subsonic/test_authentication.py
@@ -25,7 +25,6 @@ def test_auth_with_password_hex(api_request, factories):
     user = factories["users.User"]()
     user.subsonic_api_token = "password"
     user.save()
-    token = authentication.get_token(salt, "password")
     request = api_request.get(
         "/",
         {
@@ -49,7 +48,6 @@ def test_auth_with_password_cleartext(api_request, factories):
     user = factories["users.User"]()
     user.subsonic_api_token = "password"
     user.save()
-    token = authentication.get_token(salt, "password")
     request = api_request.get("/", {"u": user.username, "p": "password"})
 
     authenticator = authentication.SubsonicAuthentication()
@@ -63,7 +61,6 @@ def test_auth_with_inactive_users(api_request, factories):
     user = factories["users.User"](is_active=False)
     user.subsonic_api_token = "password"
     user.save()
-    token = authentication.get_token(salt, "password")
     request = api_request.get("/", {"u": user.username, "p": "password"})
 
     authenticator = authentication.SubsonicAuthentication()
diff --git a/api/tests/subsonic/test_views.py b/api/tests/subsonic/test_views.py
index d06bf5525d6cd7c72cc85788cbe109de46e6e2e3..ecb43ded11196a82ae3890a6643619ac9902861e 100644
--- a/api/tests/subsonic/test_views.py
+++ b/api/tests/subsonic/test_views.py
@@ -5,8 +5,6 @@ import pytest
 from django.utils import timezone
 from django.urls import reverse
 
-from rest_framework.response import Response
-
 from funkwhale_api.music import models as music_models
 from funkwhale_api.music import views as music_views
 from funkwhale_api.subsonic import renderers
@@ -80,7 +78,7 @@ def test_ping(f, db, api_client):
 def test_get_artists(f, db, logged_in_api_client, factories):
     url = reverse("api:subsonic-get-artists")
     assert url.endswith("getArtists") is True
-    artists = factories["music.Artist"].create_batch(size=10)
+    factories["music.Artist"].create_batch(size=10)
     expected = {
         "artists": serializers.GetArtistsSerializer(
             music_models.Artist.objects.all()
@@ -97,7 +95,7 @@ def test_get_artist(f, db, logged_in_api_client, factories):
     url = reverse("api:subsonic-get-artist")
     assert url.endswith("getArtist") is True
     artist = factories["music.Artist"]()
-    albums = factories["music.Album"].create_batch(size=3, artist=artist)
+    factories["music.Album"].create_batch(size=3, artist=artist)
     expected = {"artist": serializers.GetArtistSerializer(artist).data}
     response = logged_in_api_client.get(url, {"id": artist.pk})
 
@@ -124,7 +122,7 @@ def test_get_album(f, db, logged_in_api_client, factories):
     assert url.endswith("getAlbum") is True
     artist = factories["music.Artist"]()
     album = factories["music.Album"](artist=artist)
-    tracks = factories["music.Track"].create_batch(size=3, album=album)
+    factories["music.Track"].create_batch(size=3, album=album)
     expected = {"album": serializers.GetAlbumSerializer(album).data}
     response = logged_in_api_client.get(url, {"f": f, "id": album.pk})
 
@@ -166,7 +164,7 @@ def test_unstar(f, db, logged_in_api_client, factories):
     url = reverse("api:subsonic-unstar")
     assert url.endswith("unstar") is True
     track = factories["music.Track"]()
-    favorite = factories["favorites.TrackFavorite"](
+    factories["favorites.TrackFavorite"](
         track=track, user=logged_in_api_client.user
     )
     response = logged_in_api_client.get(url, {"f": f, "id": track.pk})
@@ -283,7 +281,7 @@ def test_update_playlist(f, db, logged_in_api_client, factories):
     url = reverse("api:subsonic-update-playlist")
     assert url.endswith("updatePlaylist") is True
     playlist = factories["playlists.Playlist"](user=logged_in_api_client.user)
-    plt = factories["playlists.PlaylistTrack"](index=0, playlist=playlist)
+    factories["playlists.PlaylistTrack"](index=0, playlist=playlist)
     new_track = factories["music.Track"]()
     response = logged_in_api_client.get(
         url,
@@ -350,7 +348,7 @@ def test_get_music_folders(f, db, logged_in_api_client, factories):
 def test_get_indexes(f, db, logged_in_api_client, factories):
     url = reverse("api:subsonic-get-indexes")
     assert url.endswith("getIndexes") is True
-    artists = factories["music.Artist"].create_batch(size=10)
+    factories["music.Artist"].create_batch(size=10)
     expected = {
         "indexes": serializers.GetArtistsSerializer(
             music_models.Artist.objects.all()
@@ -384,5 +382,5 @@ def test_scrobble(factories, logged_in_api_client):
 
     assert response.status_code == 200
 
-    l = logged_in_api_client.user.listenings.latest("id")
-    assert l.track == track
+    listening = logged_in_api_client.user.listenings.latest("id")
+    assert listening.track == track
diff --git a/api/tests/test_import_audio_file.py b/api/tests/test_import_audio_file.py
index 4346a4777584fdef14822202510bebd004e376d7..b9961a0022a1bba161b5791e87c03edb97182643 100644
--- a/api/tests/test_import_audio_file.py
+++ b/api/tests/test_import_audio_file.py
@@ -1,7 +1,6 @@
 import pytest
 import datetime
 import os
-import uuid
 
 from django.core.management import call_command
 from django.core.management.base import CommandError
diff --git a/api/tests/test_youtube.py b/api/tests/test_youtube.py
index 629558cc3235f60340c4a9f567e3d36c62fc1d3b..c906c1dedcc42ab43e40b33f510805e49fbb9e6b 100644
--- a/api/tests/test_youtube.py
+++ b/api/tests/test_youtube.py
@@ -1,4 +1,3 @@
-import json
 from collections import OrderedDict
 from django.urls import reverse
 from funkwhale_api.providers.youtube.client import client
diff --git a/api/tests/users/test_jwt.py b/api/tests/users/test_jwt.py
index 28ff09d7467dec9b451564abd14218db8dbbb96e..771a42efa53891736144d77feb06c62088f1a956 100644
--- a/api/tests/users/test_jwt.py
+++ b/api/tests/users/test_jwt.py
@@ -1,5 +1,4 @@
 import pytest
-import uuid
 
 from jwt.exceptions import DecodeError
 from rest_framework_jwt.settings import api_settings
diff --git a/api/tests/users/test_views.py b/api/tests/users/test_views.py
index f7a11367e15968ae8edeb0b10340cd9407661438..78d6aa4bd9c4cbf8152a599e182989e1fd4ab234 100644
--- a/api/tests/users/test_views.py
+++ b/api/tests/users/test_views.py
@@ -1,4 +1,3 @@
-import json
 import pytest
 
 from django.test import RequestFactory
@@ -114,7 +113,7 @@ def test_changing_password_updates_secret_key(logged_in_api_client):
     payload = {"old_password": "test", "new_password1": "new", "new_password2": "new"}
     url = reverse("change_password")
 
-    response = logged_in_api_client.post(url, payload)
+    logged_in_api_client.post(url, payload)
 
     user.refresh_from_db()