diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 5f65e60daa665d061cc7589f91ee3ab2755f056c..5dfbf0642691e4033bac3f82bdc6fcdeff49f878 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -3,13 +3,39 @@ variables:
   IMAGE: $IMAGE_NAME:$CI_COMMIT_REF_NAME
   IMAGE_LATEST: $IMAGE_NAME:latest
   PIP_CACHE_DIR: "$CI_PROJECT_DIR/pip-cache"
+  PYTHONDONTWRITEBYTECODE: "true"
 
 
 stages:
+  - lint
   - test
   - build
   - deploy
 
+black:
+  image: python:3.6
+  stage: lint
+  variables:
+    GIT_STRATEGY: fetch
+  before_script:
+    - pip install black
+  script:
+    - black --check --diff api/
+
+flake8:
+  image: python:3.6
+  stage: lint
+  variables:
+    GIT_STRATEGY: fetch
+  before_script:
+    - pip install flake8
+  script:
+    - flake8 -v api
+  cache:
+    key: "$CI_PROJECT_ID__flake8_pip_cache"
+    paths:
+      - "$PIP_CACHE_DIR"
+
 test_api:
   services:
     - postgres:9.4
@@ -108,7 +134,7 @@ pages:
   tags:
     - docker
 
-docker_develop:
+docker_release:
   stage: deploy
   before_script:
     - docker login -u $DOCKER_LOGIN -p $DOCKER_PASSWORD
@@ -119,8 +145,9 @@ docker_develop:
     - docker push $IMAGE
   only:
     - develop@funkwhale/funkwhale
+    - tags@funkwhale/funkwhale
   tags:
-    - dind
+    - docker-build
 
 build_api:
   # Simply publish a zip containing api/ directory
@@ -135,19 +162,3 @@ build_api:
     - tags@funkwhale/funkwhale
     - master@funkwhale/funkwhale
     - develop@funkwhale/funkwhale
-
-
-docker_release:
-  stage: deploy
-  before_script:
-    - docker login -u $DOCKER_LOGIN -p $DOCKER_PASSWORD
-    - cp -r front/dist api/frontend
-    - cd api
-  script:
-    - docker build -t $IMAGE -t $IMAGE_LATEST .
-    - docker push $IMAGE
-    - docker push $IMAGE_LATEST
-  only:
-    - tags@funkwhale/funkwhale
-  tags:
-    - dind
diff --git a/api/config/api_urls.py b/api/config/api_urls.py
index f3f61313e5f86cfef2eee14652678f46133fa07f..9f87a7af3eee635621c8596bf14561387aa53184 100644
--- a/api/config/api_urls.py
+++ b/api/config/api_urls.py
@@ -1,15 +1,13 @@
+from django.conf.urls import include, url
+from dynamic_preferences.api.viewsets import GlobalPreferencesViewSet
 from rest_framework import routers
 from rest_framework.urlpatterns import format_suffix_patterns
-from django.conf.urls import include, url
+from rest_framework_jwt import views as jwt_views
+
 from funkwhale_api.activity import views as activity_views
-from funkwhale_api.instance import views as instance_views
 from funkwhale_api.music import views
 from funkwhale_api.playlists import views as playlists_views
 from funkwhale_api.subsonic.views import SubsonicViewSet
-from rest_framework_jwt import views as jwt_views
-
-from dynamic_preferences.api.viewsets import GlobalPreferencesViewSet
-from dynamic_preferences.users.viewsets import UserPreferencesViewSet
 
 router = routers.SimpleRouter()
 router.register(r"settings", GlobalPreferencesViewSet, base_name="settings")
diff --git a/api/config/asgi.py b/api/config/asgi.py
index b976a02ebdde045933f4a2dd1997abf2ebdadddb..5ecc3ffa4d076efabd702371baa86507e9eda516 100644
--- a/api/config/asgi.py
+++ b/api/config/asgi.py
@@ -1,8 +1,9 @@
-import django
 import os
 
+import django
+
+from .routing import application  # noqa
+
 os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.settings.production")
 
 django.setup()
-
-from .routing import application
diff --git a/api/config/routing.py b/api/config/routing.py
index b1f1637593377f4553ffafc83ae6dbb204839c55..fa25aad0764fc76662c2de3c0edb3b13b4a54820 100644
--- a/api/config/routing.py
+++ b/api/config/routing.py
@@ -1,12 +1,9 @@
-from django.conf.urls import url
-
-from channels.auth import AuthMiddlewareStack
 from channels.routing import ProtocolTypeRouter, URLRouter
+from django.conf.urls import url
 
 from funkwhale_api.common.auth import TokenAuthMiddleware
 from funkwhale_api.instance import consumers
 
-
 application = ProtocolTypeRouter(
     {
         # Empty for now (http->django views is added by default)
diff --git a/api/config/settings/common.py b/api/config/settings/common.py
index f7688a4e402a94ab2261be6c662ca40214081266..cb5573ed58ddf3edc8ae4df14b7ecf799b0946e4 100644
--- a/api/config/settings/common.py
+++ b/api/config/settings/common.py
@@ -10,8 +10,9 @@ https://docs.djangoproject.com/en/dev/ref/settings/
 """
 from __future__ import absolute_import, unicode_literals
 
-from urllib.parse import urlsplit
-import os
+import datetime
+from urllib.parse import urlparse, urlsplit
+
 import environ
 from celery.schedules import crontab
 
@@ -21,7 +22,6 @@ ROOT_DIR = environ.Path(__file__) - 3  # (/a/b/myfile.py - 3 = /)
 APPS_DIR = ROOT_DIR.path("funkwhale_api")
 
 env = environ.Env()
-
 try:
     env.read_env(ROOT_DIR.file(".env"))
 except FileNotFoundError:
@@ -315,7 +315,6 @@ CACHE_DEFAULT = "redis://127.0.0.1:6379/0"
 CACHES = {"default": env.cache_url("CACHE_URL", default=CACHE_DEFAULT)}
 
 CACHES["default"]["BACKEND"] = "django_redis.cache.RedisCache"
-from urllib.parse import urlparse
 
 cache_url = urlparse(CACHES["default"]["LOCATION"])
 CHANNEL_LAYERS = {
@@ -332,12 +331,12 @@ CACHES["default"]["OPTIONS"] = {
 }
 
 
-########## CELERY
+# CELERY
 INSTALLED_APPS += ("funkwhale_api.taskapp.celery.CeleryConfig",)
 CELERY_BROKER_URL = env(
     "CELERY_BROKER_URL", default=env("CACHE_URL", default=CACHE_DEFAULT)
 )
-########## END CELERY
+# END CELERY
 # Location of root django.contrib.admin URL, use {% url 'admin:index' %}
 
 # Your common stuff: Below this line define 3rd party library settings
@@ -351,8 +350,6 @@ CELERYBEAT_SCHEDULE = {
     }
 }
 
-import datetime
-
 JWT_AUTH = {
     "JWT_ALLOW_REFRESH": True,
     "JWT_EXPIRATION_DELTA": datetime.timedelta(days=7),
diff --git a/api/config/settings/local.py b/api/config/settings/local.py
index 51e7934765ed9f339b50925a3c648c355dc4f3a1..9f0119cee54f51ec10377e662bdc8e8fa2bf32b2 100644
--- a/api/config/settings/local.py
+++ b/api/config/settings/local.py
@@ -10,6 +10,7 @@ Local settings
 
 from .common import *  # noqa
 
+
 # DEBUG
 # ------------------------------------------------------------------------------
 DEBUG = env.bool("DJANGO_DEBUG", default=True)
@@ -49,10 +50,10 @@ INSTALLED_APPS += ("debug_toolbar",)
 # ------------------------------------------------------------------------------
 TEST_RUNNER = "django.test.runner.DiscoverRunner"
 
-########## CELERY
+# CELERY
 # In development, all tasks will be executed locally by blocking until the task returns
 CELERY_TASK_ALWAYS_EAGER = False
-########## END CELERY
+# END CELERY
 
 # Your local stuff: Below this line define 3rd party library settings
 
diff --git a/api/config/settings/production.py b/api/config/settings/production.py
index 0c79ee2ef4f62feff5d762bf943b92e4effffe2f..72b08aa3c867efa475efb3dd8b5f502eed775abb 100644
--- a/api/config/settings/production.py
+++ b/api/config/settings/production.py
@@ -11,9 +11,6 @@ Production Configurations
 """
 from __future__ import absolute_import, unicode_literals
 
-from django.utils import six
-
-
 from .common import *  # noqa
 
 # SECRET CONFIGURATION
diff --git a/api/config/urls.py b/api/config/urls.py
index 60753294c643b576390303aefcd65f5f14af98d0..5ffcf211b8588c5e9ec78d21baa11f288ebf9a20 100644
--- a/api/config/urls.py
+++ b/api/config/urls.py
@@ -5,7 +5,6 @@ from django.conf import settings
 from django.conf.urls import include, url
 from django.conf.urls.static import static
 from django.contrib import admin
-from django.views.generic import TemplateView
 from django.views import defaults as default_views
 
 urlpatterns = [
diff --git a/api/config/wsgi.py b/api/config/wsgi.py
index a53b580d76c8f5c1b9659c8cdcdb1b0382433afe..8e843eb4d29c4f162fe23e1a1a2ea3c0ed622fc5 100644
--- a/api/config/wsgi.py
+++ b/api/config/wsgi.py
@@ -15,11 +15,9 @@ framework.
 """
 import os
 
-
 from django.core.wsgi import get_wsgi_application
 from whitenoise.django import DjangoWhiteNoise
 
-
 # We defer to a DJANGO_SETTINGS_MODULE already in the environment. This breaks
 # if running multiple sites in the same mod_wsgi process. To fix this, use
 # mod_wsgi daemon mode with each site in its own daemon process, or use
diff --git a/api/funkwhale_api/activity/views.py b/api/funkwhale_api/activity/views.py
index f2f747d4d8f22b6df5423a5e898e807f102220b2..701dd04b8cfbacc1f0b5fc75ab65597c87a99b55 100644
--- a/api/funkwhale_api/activity/views.py
+++ b/api/funkwhale_api/activity/views.py
@@ -4,8 +4,7 @@ from rest_framework.response import Response
 from funkwhale_api.common.permissions import ConditionalAuthentication
 from funkwhale_api.favorites.models import TrackFavorite
 
-from . import serializers
-from . import utils
+from . import serializers, utils
 
 
 class ActivityViewSet(viewsets.GenericViewSet):
diff --git a/api/funkwhale_api/common/auth.py b/api/funkwhale_api/common/auth.py
index 88010e798f085c4f8c836e9239e844f63c7e41ba..7717c836babb4940902593185416c6a6430949ed 100644
--- a/api/funkwhale_api/common/auth.py
+++ b/api/funkwhale_api/common/auth.py
@@ -1,12 +1,7 @@
 from urllib.parse import parse_qs
 
-import jwt
-
 from django.contrib.auth.models import AnonymousUser
-from django.utils.encoding import smart_text
-
 from rest_framework import exceptions
-from rest_framework_jwt.settings import api_settings
 from rest_framework_jwt.authentication import BaseJSONWebTokenAuthentication
 
 from funkwhale_api.users.models import User
diff --git a/api/funkwhale_api/common/authentication.py b/api/funkwhale_api/common/authentication.py
index 9ddc06a3be445899a85041d8afbe15e95d4cd422..10bf36613f7e7cb99a20e26184dca552cc7eed44 100644
--- a/api/funkwhale_api/common/authentication.py
+++ b/api/funkwhale_api/common/authentication.py
@@ -1,6 +1,5 @@
 from django.utils.encoding import smart_text
 from django.utils.translation import ugettext as _
-
 from rest_framework import exceptions
 from rest_framework_jwt import authentication
 from rest_framework_jwt.settings import api_settings
diff --git a/api/funkwhale_api/common/consumers.py b/api/funkwhale_api/common/consumers.py
index 32a8876dceea5da860080fa9d99a47862c2a30c7..47a666f0540fe15a7a472478b9d75516d8706ef4 100644
--- a/api/funkwhale_api/common/consumers.py
+++ b/api/funkwhale_api/common/consumers.py
@@ -1,4 +1,5 @@
 from channels.generic.websocket import JsonWebsocketConsumer
+
 from funkwhale_api.common import channels
 
 
diff --git a/api/funkwhale_api/common/fields.py b/api/funkwhale_api/common/fields.py
index de3ee37e5841616dbd265b853758ae367fa5af4a..190576efa688db2d5d9748841791b76531749136 100644
--- a/api/funkwhale_api/common/fields.py
+++ b/api/funkwhale_api/common/fields.py
@@ -1,10 +1,8 @@
 import django_filters
-
 from django.db import models
 
 from funkwhale_api.music import utils
 
-
 PRIVACY_LEVEL_CHOICES = [
     ("me", "Only me"),
     ("followers", "Me and my followers"),
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/permissions.py b/api/funkwhale_api/common/permissions.py
index 82da2c5775ef01766951e450046199a74c40c603..8f391a70c16f825e1d0b7498ec577b69853ccc00 100644
--- a/api/funkwhale_api/common/permissions.py
+++ b/api/funkwhale_api/common/permissions.py
@@ -1,8 +1,6 @@
 import operator
 
-from django.conf import settings
 from django.http import Http404
-
 from rest_framework.permissions import BasePermission
 
 from funkwhale_api.common import preferences
diff --git a/api/funkwhale_api/common/preferences.py b/api/funkwhale_api/common/preferences.py
index 9b8f12e85645a2ac27e74aea8c2f90ebd52900d6..acda9a90c31882a32c043edf9d3c8e44d2ea7c3e 100644
--- a/api/funkwhale_api/common/preferences.py
+++ b/api/funkwhale_api/common/preferences.py
@@ -1,8 +1,6 @@
-from django.conf import settings
 from django import forms
-
-from dynamic_preferences import serializers
-from dynamic_preferences import types
+from django.conf import settings
+from dynamic_preferences import serializers, types
 from dynamic_preferences.registries import global_preferences_registry
 
 
diff --git a/api/funkwhale_api/common/scripts/__init__.py b/api/funkwhale_api/common/scripts/__init__.py
index 4b2d525202218c43483dae60b6df4f4c6090723e..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 100644
--- a/api/funkwhale_api/common/scripts/__init__.py
+++ b/api/funkwhale_api/common/scripts/__init__.py
@@ -1,2 +0,0 @@
-from . import django_permissions_to_user_permissions
-from . import test
diff --git a/api/funkwhale_api/common/scripts/django_permissions_to_user_permissions.py b/api/funkwhale_api/common/scripts/django_permissions_to_user_permissions.py
index 1c207238518fba92506d06770ac22160a0c2cf17..48144f8ea7f737a39d94a1f1b96573557109300d 100644
--- a/api/funkwhale_api/common/scripts/django_permissions_to_user_permissions.py
+++ b/api/funkwhale_api/common/scripts/django_permissions_to_user_permissions.py
@@ -2,10 +2,10 @@
 Convert django permissions to user permissions in the database,
 following the work done in #152.
 """
+from django.contrib.auth.models import Permission
 from django.db.models import Q
-from funkwhale_api.users import models
 
-from django.contrib.auth.models import Permission
+from funkwhale_api.users import models
 
 mapping = {
     "dynamic_preferences.change_globalpreferencemodel": "settings",
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/common/session.py b/api/funkwhale_api/common/session.py
index 871fc4c219fec71fc8c5aacd65bd9942a09f5444..4d5d0bb60be9c009455069bbf1b76d99f1d6eb3a 100644
--- a/api/funkwhale_api/common/session.py
+++ b/api/funkwhale_api/common/session.py
@@ -1,5 +1,4 @@
 import requests
-
 from django.conf import settings
 
 import funkwhale_api
diff --git a/api/funkwhale_api/common/utils.py b/api/funkwhale_api/common/utils.py
index f2ea52a8c5ae70c13e9966605ff1cc256f50ea41..221d2336b753322e5f40ad028c15fe157d218a00 100644
--- a/api/funkwhale_api/common/utils.py
+++ b/api/funkwhale_api/common/utils.py
@@ -1,6 +1,6 @@
-from urllib.parse import urlencode, parse_qs, urlsplit, urlunsplit
 import os
 import shutil
+from urllib.parse import parse_qs, urlencode, urlsplit, urlunsplit
 
 from django.db import transaction
 
diff --git a/api/funkwhale_api/downloader/__init__.py b/api/funkwhale_api/downloader/__init__.py
index 29ec89954d154f28b8bf47248ca040001dc0be60..eca15e121d9be1167e0a72c65de662189242720c 100644
--- a/api/funkwhale_api/downloader/__init__.py
+++ b/api/funkwhale_api/downloader/__init__.py
@@ -1,2 +1,3 @@
-
 from .downloader import download
+
+__all__ = ["download"]
diff --git a/api/funkwhale_api/downloader/downloader.py b/api/funkwhale_api/downloader/downloader.py
index 3599b86ef1861e590caa63622526c72f71fafbaf..f2b7568cc5e992a4407edd86100cb73c15100587 100644
--- a/api/funkwhale_api/downloader/downloader.py
+++ b/api/funkwhale_api/downloader/downloader.py
@@ -1,9 +1,7 @@
 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/favorites/activities.py b/api/funkwhale_api/favorites/activities.py
index d9d546335bd89720abf019ac46f4c14ced999e3b..294194e061614a338137a3519aa547823a2d1cf0 100644
--- a/api/funkwhale_api/favorites/activities.py
+++ b/api/funkwhale_api/favorites/activities.py
@@ -1,5 +1,5 @@
-from funkwhale_api.common import channels
 from funkwhale_api.activity import record
+from funkwhale_api.common import channels
 
 from . import serializers
 
diff --git a/api/funkwhale_api/favorites/factories.py b/api/funkwhale_api/favorites/factories.py
index 797c135ef0d99af99f7850246ca0e041bc43d13f..d96ef1c15180c3c5d425585a3f2d562db015f139 100644
--- a/api/funkwhale_api/favorites/factories.py
+++ b/api/funkwhale_api/favorites/factories.py
@@ -1,7 +1,6 @@
 import factory
 
 from funkwhale_api.factories import registry
-
 from funkwhale_api.music.factories import TrackFactory
 from funkwhale_api.users.factories import UserFactory
 
diff --git a/api/funkwhale_api/favorites/models.py b/api/funkwhale_api/favorites/models.py
index dd2b8f3ec9515c360e2a0a00b5542eecd70c004b..a6a80cebdd0e70d8d5a67293ef4fcbcad3d0e463 100644
--- a/api/funkwhale_api/favorites/models.py
+++ b/api/funkwhale_api/favorites/models.py
@@ -1,4 +1,3 @@
-from django.conf import settings
 from django.db import models
 from django.utils import timezone
 
diff --git a/api/funkwhale_api/favorites/serializers.py b/api/funkwhale_api/favorites/serializers.py
index 40260c2aa9b2060ce3dd100d730cf6ec4e82cb66..3cafb80f021488cf0c64244a7dc1b5607d185497 100644
--- a/api/funkwhale_api/favorites/serializers.py
+++ b/api/funkwhale_api/favorites/serializers.py
@@ -1,4 +1,3 @@
-from django.conf import settings
 
 from rest_framework import serializers
 
diff --git a/api/funkwhale_api/favorites/urls.py b/api/funkwhale_api/favorites/urls.py
index b85023adeabe907773e397b88c3bc6d05da597a0..28d0c867667d24c7daa8cd090b670e2060e5d147 100644
--- a/api/funkwhale_api/favorites/urls.py
+++ b/api/funkwhale_api/favorites/urls.py
@@ -1,8 +1,7 @@
-from django.conf.urls import include, url
-from . import views
-
 from rest_framework import routers
 
+from . import views
+
 router = routers.SimpleRouter()
 router.register(r"tracks", views.TrackFavoriteViewSet, "tracks")
 
diff --git a/api/funkwhale_api/favorites/views.py b/api/funkwhale_api/favorites/views.py
index 7deae7a984dbe82b45056c736ef292951a9a8904..4d1c1e756af1bf5ca01345ad0fba172c316ac152 100644
--- a/api/funkwhale_api/favorites/views.py
+++ b/api/funkwhale_api/favorites/views.py
@@ -1,15 +1,12 @@
-from rest_framework import generics, mixins, viewsets
-from rest_framework import status
-from rest_framework.response import Response
-from rest_framework import pagination
+from rest_framework import mixins, status, viewsets
 from rest_framework.decorators import list_route
+from rest_framework.response import Response
 
 from funkwhale_api.activity import record
-from funkwhale_api.music.models import Track
 from funkwhale_api.common.permissions import ConditionalAuthentication
+from funkwhale_api.music.models import Track
 
-from . import models
-from . import serializers
+from . import models, serializers
 
 
 class TrackFavoriteViewSet(
diff --git a/api/funkwhale_api/federation/activity.py b/api/funkwhale_api/federation/activity.py
index 6dd26a87dc631a16cb1faba911b3f172e3ba7916..73e83e334534bd211daa90a684a1441b5a10907b 100644
--- a/api/funkwhale_api/federation/activity.py
+++ b/api/funkwhale_api/federation/activity.py
@@ -1,6 +1,3 @@
-from . import serializers
-from . import tasks
-
 ACTIVITY_TYPES = [
     "Accept",
     "Add",
@@ -52,9 +49,13 @@ OBJECT_TYPES = [
 
 
 def deliver(activity, on_behalf_of, to=[]):
+    from . import tasks
+
     return tasks.send.delay(activity=activity, actor_id=on_behalf_of.pk, to=to)
 
 
 def accept_follow(follow):
+    from . import serializers
+
     serializer = serializers.AcceptFollowSerializer(follow)
     return deliver(serializer.data, to=[follow.actor.url], on_behalf_of=follow.target)
diff --git a/api/funkwhale_api/federation/actors.py b/api/funkwhale_api/federation/actors.py
index 32b54565669a9574e90e29f34ec750b35ceec26f..7fbf815dc50e73bb2c15c577e418650650b5dc68 100644
--- a/api/funkwhale_api/federation/actors.py
+++ b/api/funkwhale_api/federation/actors.py
@@ -1,29 +1,19 @@
 import datetime
 import logging
-import uuid
 import xml
 
 from django.conf import settings
 from django.db import transaction
 from django.urls import reverse
 from django.utils import timezone
-
 from rest_framework.exceptions import PermissionDenied
 
-from dynamic_preferences.registries import global_preferences_registry
-
-from funkwhale_api.common import preferences
-from funkwhale_api.common import session
+from funkwhale_api.common import preferences, session
 from funkwhale_api.common import utils as funkwhale_utils
 from funkwhale_api.music import models as music_models
 from funkwhale_api.music import tasks as music_tasks
 
-from . import activity
-from . import keys
-from . import models
-from . import serializers
-from . import signing
-from . import utils
+from . import activity, keys, models, serializers, signing, utils
 
 logger = logging.getLogger(__name__)
 
@@ -45,7 +35,7 @@ def get_actor_data(actor_url):
     response.raise_for_status()
     try:
         return response.json()
-    except:
+    except Exception:
         raise ValueError("Invalid actor payload: {}".format(response.text))
 
 
@@ -155,7 +145,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 +314,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/authentication.py b/api/funkwhale_api/federation/authentication.py
index b669b400486666a1a4c3c24cb34f28734f2be62d..f32c78ff30f00079d822bbf2921d2c4845fff5fc 100644
--- a/api/funkwhale_api/federation/authentication.py
+++ b/api/funkwhale_api/federation/authentication.py
@@ -1,16 +1,8 @@
 import cryptography
-
 from django.contrib.auth.models import AnonymousUser
+from rest_framework import authentication, exceptions
 
-from rest_framework import authentication
-from rest_framework import exceptions
-
-from . import actors
-from . import keys
-from . import models
-from . import serializers
-from . import signing
-from . import utils
+from . import actors, keys, signing, utils
 
 
 class SignatureAuthentication(authentication.BaseAuthentication):
diff --git a/api/funkwhale_api/federation/dynamic_preferences_registry.py b/api/funkwhale_api/federation/dynamic_preferences_registry.py
index 21f4076eacf1725fd7cca13c9231cb18a1491249..5119d2596fab750b6312d5afbdc3c6d2447b80d0 100644
--- a/api/funkwhale_api/federation/dynamic_preferences_registry.py
+++ b/api/funkwhale_api/federation/dynamic_preferences_registry.py
@@ -1,4 +1,3 @@
-from django.forms import widgets
 
 from dynamic_preferences import types
 from dynamic_preferences.registries import global_preferences_registry
diff --git a/api/funkwhale_api/federation/factories.py b/api/funkwhale_api/federation/factories.py
index 52a5e8b54da6036a7a74985d6ee6d007aa99251c..7370ebd77d73694178a326ede77a2d0269ed16e6 100644
--- a/api/funkwhale_api/federation/factories.py
+++ b/api/funkwhale_api/federation/factories.py
@@ -1,16 +1,14 @@
+import uuid
+
 import factory
 import requests
 import requests_http_signature
-import uuid
-
-from django.utils import timezone
 from django.conf import settings
+from django.utils import timezone
 
 from funkwhale_api.factories import registry
 
-from . import keys
-from . import models
-
+from . import keys, models
 
 registry.register(keys.get_key_pair, name="federation.KeyPair")
 
diff --git a/api/funkwhale_api/federation/keys.py b/api/funkwhale_api/federation/keys.py
index fb6f0748c9be8e3b057a5271c42e40031d7cba85..e7c30c50aefc866e4ad74b6ef18a2ebaab89cb10 100644
--- a/api/funkwhale_api/federation/keys.py
+++ b/api/funkwhale_api/federation/keys.py
@@ -1,11 +1,9 @@
-from cryptography.hazmat.primitives import serialization as crypto_serialization
-from cryptography.hazmat.primitives.asymmetric import rsa
-from cryptography.hazmat.backends import default_backend as crypto_default_backend
-
 import re
 import urllib.parse
 
-from . import exceptions
+from cryptography.hazmat.backends import default_backend as crypto_default_backend
+from cryptography.hazmat.primitives import serialization as crypto_serialization
+from cryptography.hazmat.primitives.asymmetric import rsa
 
 KEY_ID_REGEX = re.compile(r"keyId=\"(?P<id>.*)\"")
 
diff --git a/api/funkwhale_api/federation/library.py b/api/funkwhale_api/federation/library.py
index 28bb9a762a4448202c135f45aa9a051e9cb6c3d6..d2ccb19524cac60d52469cc795c556cf960f51b9 100644
--- a/api/funkwhale_api/federation/library.py
+++ b/api/funkwhale_api/federation/library.py
@@ -1,15 +1,11 @@
 import json
-import requests
 
+import requests
 from django.conf import settings
 
 from funkwhale_api.common import session
 
-from . import actors
-from . import models
-from . import serializers
-from . import signing
-from . import webfinger
+from . import actors, models, serializers, signing, webfinger
 
 
 def scan_from_account_name(account_name):
@@ -28,13 +24,6 @@ def scan_from_account_name(account_name):
     except serializers.ValidationError:
         return {"webfinger": {"errors": ["Invalid account string"]}}
     system_library = actors.SYSTEM_ACTORS["library"].get_actor_instance()
-    library = (
-        models.Library.objects.filter(
-            actor__domain=domain, actor__preferred_username=username
-        )
-        .select_related("actor")
-        .first()
-    )
     data["local"] = {"following": False, "awaiting_approval": False}
     try:
         follow = models.Follow.objects.get(
diff --git a/api/funkwhale_api/federation/models.py b/api/funkwhale_api/federation/models.py
index 398ab23c4dec1100ca26d33043b831c9d7439f35..979b0674a94848dd7c0edb79f041900951629494 100644
--- a/api/funkwhale_api/federation/models.py
+++ b/api/funkwhale_api/federation/models.py
@@ -1,6 +1,6 @@
 import os
-import uuid
 import tempfile
+import uuid
 
 from django.conf import settings
 from django.contrib.postgres.fields import JSONField
diff --git a/api/funkwhale_api/federation/permissions.py b/api/funkwhale_api/federation/permissions.py
index ccffb1014c7f486581d6dc1b09ad21e1d7e25e01..a08d57e5f354dc6dd77e8ef3a477b5886a9cbde1 100644
--- a/api/funkwhale_api/federation/permissions.py
+++ b/api/funkwhale_api/federation/permissions.py
@@ -1,8 +1,8 @@
-from django.conf import settings
 
 from rest_framework.permissions import BasePermission
 
 from funkwhale_api.common import preferences
+
 from . import actors
 
 
diff --git a/api/funkwhale_api/federation/serializers.py b/api/funkwhale_api/federation/serializers.py
index 367ca99296f546040c9496b4bd62a1452185b086..062f74f476da3b818477306683a9f284a4e126bc 100644
--- a/api/funkwhale_api/federation/serializers.py
+++ b/api/funkwhale_api/federation/serializers.py
@@ -1,23 +1,16 @@
 import logging
 import urllib.parse
 
-from django.urls import reverse
-from django.conf import settings
 from django.core.paginator import Paginator
 from django.db import transaction
-
 from rest_framework import serializers
-from dynamic_preferences.registries import global_preferences_registry
 
-from funkwhale_api.common import utils as funkwhale_utils
 from funkwhale_api.common import serializers as common_serializers
+from funkwhale_api.common import utils as funkwhale_utils
 from funkwhale_api.music import models as music_models
 from funkwhale_api.music import tasks as music_tasks
-from . import activity
-from . import filters
-from . import models
-from . import utils
 
+from . import activity, filters, models, utils
 
 AP_CONTEXT = [
     "https://www.w3.org/ns/activitystreams",
@@ -341,7 +334,7 @@ class FollowSerializer(serializers.Serializer):
         return models.Follow.objects.get_or_create(
             actor=self.validated_data["actor"],
             target=self.validated_data["object"],
-            **kwargs,
+            **kwargs,  # noqa
         )[0]
 
     def to_representation(self, instance):
@@ -352,7 +345,6 @@ class FollowSerializer(serializers.Serializer):
             "object": instance.target.url,
             "type": "Follow",
         }
-        return ret
 
 
 class APIFollowSerializer(serializers.ModelSerializer):
@@ -687,7 +679,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..15525b3e513b2ccc861cbf34b693b30aa0850d29 100644
--- a/api/funkwhale_api/federation/signing.py
+++ b/api/funkwhale_api/federation/signing.py
@@ -1,9 +1,9 @@
 import logging
+
 import requests
 import requests_http_signature
 
-from . import exceptions
-from . import utils
+from . import exceptions, utils
 
 logger = logging.getLogger(__name__)
 
@@ -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/tasks.py b/api/funkwhale_api/federation/tasks.py
index 0e6ee1e609a49c802feef4754db5b21b2e332fd9..d1b5b7bd21b4a588008bf531003c25e666cd3313 100644
--- a/api/funkwhale_api/federation/tasks.py
+++ b/api/funkwhale_api/federation/tasks.py
@@ -6,19 +6,15 @@ import os
 from django.conf import settings
 from django.db.models import Q
 from django.utils import timezone
-
-from requests.exceptions import RequestException
 from dynamic_preferences.registries import global_preferences_registry
+from requests.exceptions import RequestException
 
 from funkwhale_api.common import session
-from funkwhale_api.history.models import Listening
 from funkwhale_api.taskapp import celery
 
 from . import actors
 from . import library as lb
-from . import models
-from . import signing
-
+from . import models, signing
 
 logger = logging.getLogger(__name__)
 
diff --git a/api/funkwhale_api/federation/urls.py b/api/funkwhale_api/federation/urls.py
index 3cd4cb73292475f7ed4fdfd09a8618c4b8ce3e3a..2594f554992779a5eef5c286fee4ba96e3f6393f 100644
--- a/api/funkwhale_api/federation/urls.py
+++ b/api/funkwhale_api/federation/urls.py
@@ -1,6 +1,6 @@
 from django.conf.urls import include, url
-
 from rest_framework import routers
+
 from . import views
 
 router = routers.SimpleRouter(trailing_slash=False)
diff --git a/api/funkwhale_api/federation/views.py b/api/funkwhale_api/federation/views.py
index 36bf1a4443653a48001d94e5a7a4f8ff43687289..63a1d7b7126d22138c50334d6305c7d03ae9495a 100644
--- a/api/funkwhale_api/federation/views.py
+++ b/api/funkwhale_api/federation/views.py
@@ -1,35 +1,28 @@
 from django import forms
-from django.conf import settings
 from django.core import paginator
 from django.db import transaction
-from django.http import HttpResponse
+from django.http import HttpResponse, Http404
 from django.urls import reverse
-
-from rest_framework import mixins
-from rest_framework import permissions as rest_permissions
-from rest_framework import response
-from rest_framework import views
-from rest_framework import viewsets
-from rest_framework.decorators import list_route, detail_route
-from rest_framework.serializers import ValidationError
+from rest_framework import mixins, response, viewsets
+from rest_framework.decorators import detail_route, list_route
 
 from funkwhale_api.common import preferences
-from funkwhale_api.common import utils as funkwhale_utils
 from funkwhale_api.music import models as music_models
 from funkwhale_api.users.permissions import HasUserPermission
 
-from . import activity
-from . import actors
-from . import authentication
-from . import filters
-from . import library
-from . import models
-from . import permissions
-from . import renderers
-from . import serializers
-from . import tasks
-from . import utils
-from . import webfinger
+from . import (
+    actors,
+    authentication,
+    filters,
+    library,
+    models,
+    permissions,
+    renderers,
+    serializers,
+    tasks,
+    utils,
+    webfinger,
+)
 
 
 class FederationMixin(object):
@@ -64,7 +57,7 @@ class InstanceActorViewSet(FederationMixin, viewsets.GenericViewSet):
         handler = getattr(system_actor, "{}_inbox".format(request.method.lower()))
 
         try:
-            data = handler(request.data, actor=request.actor)
+            handler(request.data, actor=request.actor)
         except NotImplementedError:
             return response.Response(status=405)
         return response.Response({}, status=200)
@@ -74,7 +67,7 @@ class InstanceActorViewSet(FederationMixin, viewsets.GenericViewSet):
         system_actor = self.get_object()
         handler = getattr(system_actor, "{}_outbox".format(request.method.lower()))
         try:
-            data = handler(request.data, actor=request.actor)
+            handler(request.data, actor=request.actor)
         except NotImplementedError:
             return response.Response(status=405)
         return response.Response({}, status=200)
@@ -151,7 +144,7 @@ class MusicFilesViewSet(FederationMixin, viewsets.GenericViewSet):
         else:
             try:
                 page_number = int(page)
-            except:
+            except Exception:
                 return response.Response({"page": ["Invalid page number"]}, status=400)
             p = paginator.Paginator(
                 qs, preferences.get("federation__collection_page_size")
@@ -249,7 +242,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/federation/webfinger.py b/api/funkwhale_api/federation/webfinger.py
index b37f02e8a8bb8b5abbe4b45346740e0b554dc8fd..b899fe20725ec929e8a81088e8e1600d9124678e 100644
--- a/api/funkwhale_api/federation/webfinger.py
+++ b/api/funkwhale_api/federation/webfinger.py
@@ -1,12 +1,9 @@
 from django import forms
 from django.conf import settings
-from django.urls import reverse
 
 from funkwhale_api.common import session
 
-from . import actors
-from . import utils
-from . import serializers
+from . import actors, serializers
 
 VALID_RESOURCE_TYPES = ["acct"]
 
diff --git a/api/funkwhale_api/history/activities.py b/api/funkwhale_api/history/activities.py
index 3e8556ce55425767cf0b31a91566c003f7311baf..b63de1f26fc7ccc256365d1b4aa63178956101da 100644
--- a/api/funkwhale_api/history/activities.py
+++ b/api/funkwhale_api/history/activities.py
@@ -1,5 +1,5 @@
-from funkwhale_api.common import channels
 from funkwhale_api.activity import record
+from funkwhale_api.common import channels
 
 from . import serializers
 
diff --git a/api/funkwhale_api/history/models.py b/api/funkwhale_api/history/models.py
index 2edc98fbf34a0cd28e63aead16ab184e9a0946d7..8da4e67cd5a508a6778886c1a5d0f898db4e115c 100644
--- a/api/funkwhale_api/history/models.py
+++ b/api/funkwhale_api/history/models.py
@@ -1,6 +1,5 @@
-from django.utils import timezone
 from django.db import models
-from django.core.exceptions import ValidationError
+from django.utils import timezone
 
 from funkwhale_api.music.models import Track
 
diff --git a/api/funkwhale_api/history/urls.py b/api/funkwhale_api/history/urls.py
index 30e0105c05474bb5ccb54be3ebae86d2ceb3dc4d..707e95cd7d3056ced030a6f52b584456134c19e3 100644
--- a/api/funkwhale_api/history/urls.py
+++ b/api/funkwhale_api/history/urls.py
@@ -1,8 +1,7 @@
-from django.conf.urls import include, url
-from . import views
-
 from rest_framework import routers
 
+from . import views
+
 router = routers.SimpleRouter()
 router.register(r"listenings", views.ListeningViewSet, "listenings")
 
diff --git a/api/funkwhale_api/history/views.py b/api/funkwhale_api/history/views.py
index 057e6b3238439390a24c0c95774313d83e0b30c9..e104a2aa3dc44f3c538bc747df63a6e5d630f10d 100644
--- a/api/funkwhale_api/history/views.py
+++ b/api/funkwhale_api/history/views.py
@@ -1,14 +1,8 @@
-from rest_framework import generics, mixins, viewsets
-from rest_framework import permissions
-from rest_framework import status
-from rest_framework.response import Response
-from rest_framework.decorators import detail_route
+from rest_framework import mixins, permissions, viewsets
 
 from funkwhale_api.activity import record
-from funkwhale_api.common.permissions import ConditionalAuthentication
 
-from . import models
-from . import serializers
+from . import models, serializers
 
 
 class ListeningViewSet(
diff --git a/api/funkwhale_api/instance/dynamic_preferences_registry.py b/api/funkwhale_api/instance/dynamic_preferences_registry.py
index 618bd8ea4d69d81af8b5e22a0fd92e0a3e9568b4..0edb94482d0bb090ed15b79156b565e9ea33c1f7 100644
--- a/api/funkwhale_api/instance/dynamic_preferences_registry.py
+++ b/api/funkwhale_api/instance/dynamic_preferences_registry.py
@@ -1,5 +1,4 @@
 from django.forms import widgets
-
 from dynamic_preferences import types
 from dynamic_preferences.registries import global_preferences_registry
 
diff --git a/api/funkwhale_api/instance/nodeinfo.py b/api/funkwhale_api/instance/nodeinfo.py
index ea982a63fea5f8ae5037c4f40cf7da3b49fc8625..0b8f4b3cecc5d456637b20d051550e48a160834f 100644
--- a/api/funkwhale_api/instance/nodeinfo.py
+++ b/api/funkwhale_api/instance/nodeinfo.py
@@ -5,14 +5,12 @@ from funkwhale_api.common import preferences
 
 from . import stats
 
-
 store = memoize.djangocache.Cache("default")
 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/instance/views.py b/api/funkwhale_api/instance/views.py
index 69663c125699adbc6e9cad2344fa184fae71d42e..ea6311033333ad0603a1f88d52fd51bda44ceeaa 100644
--- a/api/funkwhale_api/instance/views.py
+++ b/api/funkwhale_api/instance/views.py
@@ -1,16 +1,13 @@
-from rest_framework import views
-from rest_framework.response import Response
-
 from dynamic_preferences.api import serializers
 from dynamic_preferences.api import viewsets as preferences_viewsets
 from dynamic_preferences.registries import global_preferences_registry
+from rest_framework import views
+from rest_framework.response import Response
 
 from funkwhale_api.common import preferences
 from funkwhale_api.users.permissions import HasUserPermission
 
 from . import nodeinfo
-from . import stats
-
 
 NODEINFO_2_CONTENT_TYPE = "application/json; profile=http://nodeinfo.diaspora.software/ns/schema/2.0#; charset=utf-8"  # noqa
 
diff --git a/api/funkwhale_api/manage/filters.py b/api/funkwhale_api/manage/filters.py
index 6bb8a1ccc28ed6c9c89685f0f1a701917ffc3197..2f2bde838fa90695ebc1f077e88650f2d69536c5 100644
--- a/api/funkwhale_api/manage/filters.py
+++ b/api/funkwhale_api/manage/filters.py
@@ -1,4 +1,3 @@
-from django.db.models import Count
 
 from django_filters import rest_framework as filters
 
diff --git a/api/funkwhale_api/manage/urls.py b/api/funkwhale_api/manage/urls.py
index 38ed7d1c99b6bc152aa0100098332f39528f8369..60853034f0a0552c01b67b6a0354158691d49783 100644
--- a/api/funkwhale_api/manage/urls.py
+++ b/api/funkwhale_api/manage/urls.py
@@ -1,8 +1,8 @@
 from django.conf.urls import include, url
-from . import views
-
 from rest_framework import routers
 
+from . import views
+
 library_router = routers.SimpleRouter()
 library_router.register(r"track-files", views.ManageTrackFileViewSet, "track-files")
 
diff --git a/api/funkwhale_api/manage/views.py b/api/funkwhale_api/manage/views.py
index 77581acf0e4537106240fdb5809fe5fbc9f25358..8511732c96b287e7c2c82da799dc864c7a455e6a 100644
--- a/api/funkwhale_api/manage/views.py
+++ b/api/funkwhale_api/manage/views.py
@@ -1,13 +1,10 @@
-from rest_framework import mixins
-from rest_framework import response
-from rest_framework import viewsets
+from rest_framework import mixins, response, viewsets
 from rest_framework.decorators import list_route
 
 from funkwhale_api.music import models as music_models
 from funkwhale_api.users.permissions import HasUserPermission
 
-from . import filters
-from . import serializers
+from . import filters, serializers
 
 
 class ManageTrackFileViewSet(
diff --git a/api/funkwhale_api/music/factories.py b/api/funkwhale_api/music/factories.py
index 6e2e6a1155b6c6a3e95c3eabef2d9f3c8629f003..2dd4ba3038593cc2bb2c60610735caeb7f61bc8f 100644
--- a/api/funkwhale_api/music/factories.py
+++ b/api/funkwhale_api/music/factories.py
@@ -1,7 +1,8 @@
-import factory
 import os
 
-from funkwhale_api.factories import registry, ManyToManyFromList
+import factory
+
+from funkwhale_api.factories import ManyToManyFromList, registry
 from funkwhale_api.federation.factories import LibraryTrackFactory
 from funkwhale_api.users.factories import UserFactory
 
diff --git a/api/funkwhale_api/music/fake_data.py b/api/funkwhale_api/music/fake_data.py
index de7b61ef54699f2919f2cbb91c69362a7f993a66..e5fd65d8ebcb2bb24e0dd0f936cd6fe8e1efcf91 100644
--- a/api/funkwhale_api/music/fake_data.py
+++ b/api/funkwhale_api/music/fake_data.py
@@ -3,7 +3,6 @@ Populates the database with fake data
 """
 import random
 
-from funkwhale_api.music import models
 from funkwhale_api.music import factories
 
 
diff --git a/api/funkwhale_api/music/filters.py b/api/funkwhale_api/music/filters.py
index 6e1e4df09d117fa7d0441d6ae4204056fc993297..1f73fc9b0638df2d15520f5522fb13c013989de0 100644
--- a/api/funkwhale_api/music/filters.py
+++ b/api/funkwhale_api/music/filters.py
@@ -1,8 +1,8 @@
 from django.db.models import Count
-
 from django_filters import rest_framework as filters
 
 from funkwhale_api.common import fields
+
 from . import models
 
 
diff --git a/api/funkwhale_api/music/lyrics.py b/api/funkwhale_api/music/lyrics.py
index 4fd31d92cd13f46a87c12fb34576076bc8a933cd..6d5f20e44d54320db9ebc4fb5b344de6585ba6cf 100644
--- a/api/funkwhale_api/music/lyrics.py
+++ b/api/funkwhale_api/music/lyrics.py
@@ -1,5 +1,5 @@
 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..988f9bed36e605c9417021314482c132008680c4 100644
--- a/api/funkwhale_api/music/management/commands/fix_track_files.py
+++ b/api/funkwhale_api/music/management/commands/fix_track_files.py
@@ -1,10 +1,7 @@
 import cacheops
-import os
-
+from django.core.management.base import BaseCommand
 from django.db import transaction
 from django.db.models import Q
-from django.conf import settings
-from django.core.management.base import BaseCommand, CommandError
 
 from funkwhale_api.music import models, utils
 
@@ -70,8 +67,7 @@ class Command(BaseCommand):
             try:
                 audio_file = tf.get_audio_file()
                 if audio_file:
-                    with audio_file as f:
-                        data = utils.get_audio_file_data(audio_file)
+                    data = utils.get_audio_file_data(audio_file)
                     tf.bitrate = data["bitrate"]
                     tf.duration = data["length"]
                     tf.save(update_fields=["duration", "bitrate"])
diff --git a/api/funkwhale_api/music/metadata.py b/api/funkwhale_api/music/metadata.py
index 3a43521c580428736b90690f432f3d81ab3f9749..d2534f6b241ad3e7b6cc98fa8e1e0c49f41f0450 100644
--- a/api/funkwhale_api/music/metadata.py
+++ b/api/funkwhale_api/music/metadata.py
@@ -1,6 +1,6 @@
-from django import forms
 import arrow
 import mutagen
+from django import forms
 
 NODEFAULT = object()
 
diff --git a/api/funkwhale_api/music/migrations/0004_track_tags.py b/api/funkwhale_api/music/migrations/0004_track_tags.py
index c00f5edfe9e0f79d13cd660a1a782306ab7737ba..b999a70313ce7951fdfed67c534592c55cb834e1 100644
--- a/api/funkwhale_api/music/migrations/0004_track_tags.py
+++ b/api/funkwhale_api/music/migrations/0004_track_tags.py
@@ -1,7 +1,7 @@
 # -*- coding: utf-8 -*-
 from __future__ import unicode_literals
 
-from django.db import migrations, models
+from django.db import migrations
 import taggit.managers
 
 
diff --git a/api/funkwhale_api/music/migrations/0009_auto_20160920_1614.py b/api/funkwhale_api/music/migrations/0009_auto_20160920_1614.py
index 2999df60ccc0d00fe6c638eb61be9eb3dc20c58d..eff0f82a032af7d5441b0d885db5aca3b477f31a 100644
--- a/api/funkwhale_api/music/migrations/0009_auto_20160920_1614.py
+++ b/api/funkwhale_api/music/migrations/0009_auto_20160920_1614.py
@@ -3,7 +3,6 @@ from __future__ import unicode_literals
 
 from django.db import migrations, models
 import django.utils.timezone
-import versatileimagefield.fields
 
 
 class Migration(migrations.Migration):
diff --git a/api/funkwhale_api/music/migrations/0010_auto_20160920_1742.py b/api/funkwhale_api/music/migrations/0010_auto_20160920_1742.py
index dcb4f79504cc80a281c85020d3c170f8a3458dbc..2b5ce935b7f44f10d6601e1e9e0bae54b8e95e29 100644
--- a/api/funkwhale_api/music/migrations/0010_auto_20160920_1742.py
+++ b/api/funkwhale_api/music/migrations/0010_auto_20160920_1742.py
@@ -2,7 +2,6 @@
 from __future__ import unicode_literals
 
 from django.db import migrations, models
-import versatileimagefield.fields
 
 
 class Migration(migrations.Migration):
diff --git a/api/funkwhale_api/music/migrations/0011_rename_files.py b/api/funkwhale_api/music/migrations/0011_rename_files.py
index 7152cca3b15942bb87ed82bc1c4d252a416632d9..2aafb126c5795ed95e889c31f11ba31eb44faf5f 100644
--- a/api/funkwhale_api/music/migrations/0011_rename_files.py
+++ b/api/funkwhale_api/music/migrations/0011_rename_files.py
@@ -1,9 +1,7 @@
 # -*- coding: utf-8 -*-
 from __future__ import unicode_literals
-import os
 
 from django.db import migrations, models
-from funkwhale_api.common.utils import rename_file
 
 
 def rename_files(apps, schema_editor):
diff --git a/api/funkwhale_api/music/migrations/0012_auto_20161122_1905.py b/api/funkwhale_api/music/migrations/0012_auto_20161122_1905.py
index 016d1c110d319a2effbff460d90e3de5cf8170a7..0cf1e44f074f4b0d7ffb0ae6bdd12cb783f51123 100644
--- a/api/funkwhale_api/music/migrations/0012_auto_20161122_1905.py
+++ b/api/funkwhale_api/music/migrations/0012_auto_20161122_1905.py
@@ -1,7 +1,7 @@
 # -*- coding: utf-8 -*-
 from __future__ import unicode_literals
 
-from django.db import migrations, models
+from django.db import migrations
 import versatileimagefield.fields
 
 
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..c8bd1c5e3c3a464cdd6860f0cf3e1e6a9b0f843c 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,9 +1,7 @@
 # -*- coding: utf-8 -*-
 from __future__ import unicode_literals
-import os
 
-from django.db import migrations, models
-from funkwhale_api.common.utils import rename_file
+from django.db import migrations
 
 
 def bind_jobs(apps, schema_editor):
diff --git a/api/funkwhale_api/music/migrations/0019_populate_mimetypes.py b/api/funkwhale_api/music/migrations/0019_populate_mimetypes.py
index 55f9a127ad5e82f1637234b3db37a038ca67c36f..11678efbcabfecaefc5d4a58e8459dfd4a04beca 100644
--- a/api/funkwhale_api/music/migrations/0019_populate_mimetypes.py
+++ b/api/funkwhale_api/music/migrations/0019_populate_mimetypes.py
@@ -1,8 +1,7 @@
 # -*- coding: utf-8 -*-
 from __future__ import unicode_literals
-import os
 
-from django.db import migrations, models
+from django.db import migrations
 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..065384a97c7858c30107cbdb31e2b007ca2d10a9 100644
--- a/api/funkwhale_api/music/migrations/0021_populate_batch_status.py
+++ b/api/funkwhale_api/music/migrations/0021_populate_batch_status.py
@@ -1,8 +1,7 @@
 # -*- coding: utf-8 -*-
 from __future__ import unicode_literals
-import os
 
-from django.db import migrations, models
+from django.db import migrations
 
 
 def populate_status(apps, schema_editor):
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..8b638ce7daff025cd7d68eaba2d93dcb7ec1f562 100644
--- a/api/funkwhale_api/music/models.py
+++ b/api/funkwhale_api/music/models.py
@@ -1,30 +1,26 @@
-import os
-import io
-import arrow
 import datetime
-import tempfile
+import os
 import shutil
-import markdown
+import tempfile
 import uuid
 
+import arrow
+import markdown
 from django.conf import settings
-from django.db import models
-from django.core.files.base import ContentFile
 from django.core.files import File
+from django.core.files.base import ContentFile
+from django.db import models
 from django.db.models.signals import post_save
 from django.dispatch import receiver
 from django.urls import reverse
 from django.utils import timezone
-
 from taggit.managers import TaggableManager
 from versatileimagefield.fields import VersatileImageField
 
-from funkwhale_api import downloader
-from funkwhale_api import musicbrainz
+from funkwhale_api import downloader, musicbrainz
 from funkwhale_api.federation import utils as federation_utils
-from . import importers
-from . import metadata
-from . import utils
+
+from . import importers, metadata, utils
 
 
 class APIModelMixin(models.Model):
@@ -71,7 +67,7 @@ class APIModelMixin(models.Model):
             try:
                 cleaned_key, cleaned_value = mapping.from_musicbrainz(key, value)
                 cleaned_data[cleaned_key] = cleaned_value
-            except KeyError as e:
+            except KeyError:
                 pass
         return cleaned_data
 
@@ -138,9 +134,7 @@ def import_tracks(instance, cleaned_data, raw_data):
         track_cleaned_data = Track.clean_musicbrainz_data(track_data["recording"])
         track_cleaned_data["album"] = instance
         track_cleaned_data["position"] = int(track_data["position"])
-        track = importers.load(
-            Track, track_cleaned_data, track_data, Track.import_hooks
-        )
+        importers.load(Track, track_cleaned_data, track_data, Track.import_hooks)
 
 
 class AlbumQuerySet(models.QuerySet):
@@ -265,13 +259,13 @@ class Work(APIModelMixin):
     import_hooks = [import_lyrics, link_recordings]
 
     def fetch_lyrics(self):
-        l = self.lyrics.first()
-        if l:
-            return l
+        lyric = self.lyrics.first()
+        if lyric:
+            return lyric
         data = self.api.get(self.mbid, includes=["url-rels"])["work"]
-        l = import_lyrics(self, {}, data)
+        lyric = import_lyrics(self, {}, data)
 
-        return l
+        return lyric
 
 
 class Lyrics(models.Model):
@@ -612,7 +606,7 @@ def update_request_status(sender, instance, created, **kwargs):
     if not instance.import_request:
         return
 
-    if not created and not "status" in update_fields:
+    if not created and "status" not in update_fields:
         return
 
     r_status = instance.import_request.status
diff --git a/api/funkwhale_api/music/permissions.py b/api/funkwhale_api/music/permissions.py
index a85e5a9a6e7f3744cde50da1b9b46812a24ecdd2..dc589b5dde4b3dbbd7c720cc73684d1b648497e4 100644
--- a/api/funkwhale_api/music/permissions.py
+++ b/api/funkwhale_api/music/permissions.py
@@ -1,10 +1,8 @@
-from django.conf import settings
 
 from rest_framework.permissions import BasePermission
 
 from funkwhale_api.common import preferences
-from funkwhale_api.federation import actors
-from funkwhale_api.federation import models
+from funkwhale_api.federation import actors, models
 
 
 class Listen(BasePermission):
diff --git a/api/funkwhale_api/music/serializers.py b/api/funkwhale_api/music/serializers.py
index 7aa8603e2c0b938c51e2dc17156acebdb8e7de2a..c34970d0b5cbcf29155c7b008c0ba4acd6246f1c 100644
--- a/api/funkwhale_api/music/serializers.py
+++ b/api/funkwhale_api/music/serializers.py
@@ -1,16 +1,11 @@
-from django.db import transaction
 from django.db.models import Q
 from rest_framework import serializers
 from taggit.models import Tag
 
 from funkwhale_api.activity import serializers as activity_serializers
-from funkwhale_api.federation import utils as federation_utils
-from funkwhale_api.federation.models import LibraryTrack
-from funkwhale_api.federation.serializers import AP_CONTEXT
 from funkwhale_api.users.serializers import UserBasicSerializer
 
-from . import models
-from . import tasks
+from . import models, tasks
 
 
 class ArtistAlbumSerializer(serializers.ModelSerializer):
diff --git a/api/funkwhale_api/music/tasks.py b/api/funkwhale_api/music/tasks.py
index 9dcaceec48460794dd07b23208ab0a0862f0099b..355af7706d6cca3d2d637311a6205dfa26c77c1c 100644
--- a/api/funkwhale_api/music/tasks.py
+++ b/api/funkwhale_api/music/tasks.py
@@ -1,22 +1,19 @@
 import logging
 import os
 
+from django.conf import settings
 from django.core.files.base import ContentFile
-
 from musicbrainzngs import ResponseError
 
 from funkwhale_api.common import preferences
-from funkwhale_api.federation import activity
-from funkwhale_api.federation import actors
-from funkwhale_api.federation import models as federation_models
+from funkwhale_api.federation import activity, actors
 from funkwhale_api.federation import serializers as federation_serializers
-from funkwhale_api.taskapp import celery
 from funkwhale_api.providers.acoustid import get_acoustid_client
 from funkwhale_api.providers.audiofile import tasks as audiofile_tasks
+from funkwhale_api.taskapp import celery
 
-from django.conf import settings
-from . import models
 from . import lyrics as lyrics_utils
+from . import models
 from . import utils as music_utils
 
 logger = logging.getLogger(__name__)
@@ -259,7 +256,7 @@ def import_job_run(self, import_job, replace=False, use_acoustid=False):
         if not settings.DEBUG:
             try:
                 self.retry(exc=exc, countdown=30, max_retries=3)
-            except:
+            except Exception:
                 mark_errored(exc)
                 raise
         mark_errored(exc)
diff --git a/api/funkwhale_api/music/utils.py b/api/funkwhale_api/music/utils.py
index 9b300ac2a4281a917b809e346cba4b670571e88f..3080c1c6c056b84aa29842d1040087d3f0492ad6 100644
--- a/api/funkwhale_api/music/utils.py
+++ b/api/funkwhale_api/music/utils.py
@@ -1,8 +1,8 @@
-import magic
 import mimetypes
-import mutagen
 import re
 
+import magic
+import mutagen
 from django.db.models import Q
 
 
diff --git a/api/funkwhale_api/music/views.py b/api/funkwhale_api/music/views.py
index 15421fa3811ab2e32c13d5e43bcd013ecac222f8..77a82dd21d36b2502eec37d2f188e58d1ab31501 100644
--- a/api/funkwhale_api/music/views.py
+++ b/api/funkwhale_api/music/views.py
@@ -1,46 +1,32 @@
-import ffmpeg
-import os
 import json
 import logging
-import subprocess
-import unicodedata
 import urllib
 
-from django.contrib.auth.decorators import login_required
-from django.core.exceptions import ObjectDoesNotExist
 from django.conf import settings
-from django.db import models, transaction
-from django.db.models.functions import Length
+from django.core.exceptions import ObjectDoesNotExist
+from django.db import transaction
 from django.db.models import Count
-from django.http import StreamingHttpResponse
-from django.urls import reverse
+from django.db.models.functions import Length
 from django.utils import timezone
-from django.utils.decorators import method_decorator
-
-from rest_framework import viewsets, views, mixins
+from musicbrainzngs import ResponseError
+from rest_framework import mixins
+from rest_framework import settings as rest_settings
+from rest_framework import views, viewsets
 from rest_framework.decorators import detail_route, list_route
 from rest_framework.response import Response
-from rest_framework import settings as rest_settings
-from rest_framework import permissions
-from musicbrainzngs import ResponseError
+from taggit.models import Tag
 
 from funkwhale_api.common import utils as funkwhale_utils
 from funkwhale_api.common.permissions import ConditionalAuthentication
-from funkwhale_api.users.permissions import HasUserPermission
-from taggit.models import Tag
-from funkwhale_api.federation import actors
 from funkwhale_api.federation.authentication import SignatureAuthentication
 from funkwhale_api.federation.models import LibraryTrack
 from funkwhale_api.musicbrainz import api
 from funkwhale_api.requests.models import ImportRequest
+from funkwhale_api.users.permissions import HasUserPermission
 
-from . import filters
-from . import importers
-from . import models
+from . import filters, importers, models
 from . import permissions as music_permissions
-from . import serializers
-from . import tasks
-from . import utils
+from . import serializers, tasks, utils
 
 logger = logging.getLogger(__name__)
 
@@ -471,9 +457,7 @@ class SubmitViewSet(viewsets.ViewSet):
         import_request = self.get_import_request(data)
         artist_data = api.artists.get(id=data["artistId"])["artist"]
         cleaned_data = models.Artist.clean_musicbrainz_data(artist_data)
-        artist = importers.load(
-            models.Artist, cleaned_data, artist_data, import_hooks=[]
-        )
+        importers.load(models.Artist, cleaned_data, artist_data, import_hooks=[])
 
         import_data = []
         batch = None
diff --git a/api/funkwhale_api/musicbrainz/__init__.py b/api/funkwhale_api/musicbrainz/__init__.py
index 00aa85d5c3ce804e66c3f346e391544a1a4705ee..103da679f942d74894ac500c0ea081d4f4c31439 100644
--- a/api/funkwhale_api/musicbrainz/__init__.py
+++ b/api/funkwhale_api/musicbrainz/__init__.py
@@ -1 +1,3 @@
 from .client import api
+
+__all__ = ["api"]
diff --git a/api/funkwhale_api/musicbrainz/client.py b/api/funkwhale_api/musicbrainz/client.py
index b3749a93b39bcb6a7a33973f6eec8c7fca4d8643..deae0672fdd994c3914149d18a561f96ad2a77ac 100644
--- a/api/funkwhale_api/musicbrainz/client.py
+++ b/api/funkwhale_api/musicbrainz/client.py
@@ -1,7 +1,7 @@
-import musicbrainzngs
 import memoize.djangocache
-
+import musicbrainzngs
 from django.conf import settings
+
 from funkwhale_api import __version__
 
 _api = musicbrainzngs
diff --git a/api/funkwhale_api/musicbrainz/urls.py b/api/funkwhale_api/musicbrainz/urls.py
index edb421202394fa922dd3ee41b9056192eeedd1c4..d14447f14a62a73a494e9c6752d67274824f18ed 100644
--- a/api/funkwhale_api/musicbrainz/urls.py
+++ b/api/funkwhale_api/musicbrainz/urls.py
@@ -1,4 +1,4 @@
-from django.conf.urls import include, url
+from django.conf.urls import url
 from rest_framework import routers
 
 from . import views
diff --git a/api/funkwhale_api/musicbrainz/views.py b/api/funkwhale_api/musicbrainz/views.py
index 64d4ee15236508546cb7f7e9a17709157b46788f..b6f009dca7531dd932f9d5c32c6e3ae1f65cb03e 100644
--- a/api/funkwhale_api/musicbrainz/views.py
+++ b/api/funkwhale_api/musicbrainz/views.py
@@ -1,12 +1,10 @@
 from rest_framework import viewsets
-from rest_framework.views import APIView
-from rest_framework.response import Response
 from rest_framework.decorators import list_route
-import musicbrainzngs
+from rest_framework.response import Response
+from rest_framework.views import APIView
 
 from funkwhale_api.common.permissions import ConditionalAuthentication
 
-
 from .client import api
 
 
diff --git a/api/funkwhale_api/playlists/models.py b/api/funkwhale_api/playlists/models.py
index ef787d276fd83438c5bc8eaeb0b857756200f094..e9df4624de9b32d9ef45a1599f545f3cccf72e98 100644
--- a/api/funkwhale_api/playlists/models.py
+++ b/api/funkwhale_api/playlists/models.py
@@ -1,12 +1,8 @@
-from django.conf import settings
-from django.db import models
-from django.db import transaction
+from django.db import models, transaction
 from django.utils import timezone
-
 from rest_framework import exceptions
 
-from funkwhale_api.common import fields
-from funkwhale_api.common import preferences
+from funkwhale_api.common import fields, preferences
 
 
 class PlaylistQuerySet(models.QuerySet):
diff --git a/api/funkwhale_api/playlists/serializers.py b/api/funkwhale_api/playlists/serializers.py
index 3fac68b0e9fb3086aa3a1cdcf7417f7c4a589383..17cc06b10bdab8f17fb4f3cc246a5e5e26d12fab 100644
--- a/api/funkwhale_api/playlists/serializers.py
+++ b/api/funkwhale_api/playlists/serializers.py
@@ -1,12 +1,11 @@
-from django.conf import settings
 from django.db import transaction
 from rest_framework import serializers
-from taggit.models import Tag
 
 from funkwhale_api.common import preferences
 from funkwhale_api.music.models import Track
 from funkwhale_api.music.serializers import TrackSerializer
 from funkwhale_api.users.serializers import UserBasicSerializer
+
 from . import models
 
 
diff --git a/api/funkwhale_api/playlists/views.py b/api/funkwhale_api/playlists/views.py
index f45d8b2720ff4aaeef304a258b5ae23364d5a26e..d5d19df74b66289c0230c38633dc591c19200bb1 100644
--- a/api/funkwhale_api/playlists/views.py
+++ b/api/funkwhale_api/playlists/views.py
@@ -1,20 +1,13 @@
-from django.db.models import Count
 from django.db import transaction
-
-from rest_framework import exceptions
-from rest_framework import generics, mixins, viewsets
-from rest_framework import status
+from django.db.models import Count
+from rest_framework import exceptions, mixins, viewsets
 from rest_framework.decorators import detail_route
-from rest_framework.response import Response
 from rest_framework.permissions import IsAuthenticatedOrReadOnly
+from rest_framework.response import Response
 
-from funkwhale_api.common import permissions
-from funkwhale_api.common import fields
-from funkwhale_api.music.models import Track
+from funkwhale_api.common import fields, permissions
 
-from . import filters
-from . import models
-from . import serializers
+from . import filters, models, serializers
 
 
 class PlaylistViewSet(
diff --git a/api/funkwhale_api/providers/acoustid/dynamic_preferences_registry.py b/api/funkwhale_api/providers/acoustid/dynamic_preferences_registry.py
index 2e5a35f0db60cf7ad1b898ada7bfba91bcc7e382..2411de86add2154645f670491fd0377996ef216c 100644
--- a/api/funkwhale_api/providers/acoustid/dynamic_preferences_registry.py
+++ b/api/funkwhale_api/providers/acoustid/dynamic_preferences_registry.py
@@ -1,7 +1,6 @@
 from django import forms
-
-from dynamic_preferences.types import StringPreference, Section
 from dynamic_preferences.registries import global_preferences_registry
+from dynamic_preferences.types import Section, StringPreference
 
 acoustid = Section("providers_acoustid")
 
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..de2560d3c8d064a0bddd93208de82e0b7d3c99ca 100644
--- a/api/funkwhale_api/providers/audiofile/management/commands/import_files.py
+++ b/api/funkwhale_api/providers/audiofile/management/commands/import_files.py
@@ -5,8 +5,7 @@ from django.conf import settings
 from django.core.files import File
 from django.core.management.base import BaseCommand, CommandError
 
-from funkwhale_api.music import models
-from funkwhale_api.music import tasks
+from funkwhale_api.music import models, tasks
 from funkwhale_api.users.models import User
 
 
@@ -178,7 +177,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..ee486345a7cc3535e64edec9a994df7e7b8f935c 100644
--- a/api/funkwhale_api/providers/audiofile/tasks.py
+++ b/api/funkwhale_api/providers/audiofile/tasks.py
@@ -1,12 +1,6 @@
-import acoustid
-import os
-import datetime
-from django.core.files import File
 from django.db import transaction
 
-from funkwhale_api.taskapp import celery
-from funkwhale_api.providers.acoustid import get_acoustid_client
-from funkwhale_api.music import models, metadata
+from funkwhale_api.music import metadata, models
 
 
 @transaction.atomic
@@ -49,33 +43,3 @@ def import_track_data_from_path(path):
         defaults={"title": data.get("title"), "position": position},
     )[0]
     return track
-
-
-def import_metadata_with_musicbrainz(path):
-    pass
-
-
-@celery.app.task(name="audiofile.from_path")
-def from_path(path):
-    acoustid_track_id = None
-    try:
-        client = get_acoustid_client()
-        result = client.get_best_match(path)
-        acoustid_track_id = result["id"]
-    except acoustid.WebServiceError:
-        track = import_track_data_from_path(path)
-    except (TypeError, KeyError):
-        track = import_metadata_without_musicbrainz(path)
-    else:
-        track, created = models.Track.get_or_create_from_api(
-            mbid=result["recordings"][0]["id"]
-        )
-
-    if track.files.count() > 0:
-        raise ValueError("File already exists for track {}".format(track.pk))
-
-    track_file = models.TrackFile(track=track, acoustid_track_id=acoustid_track_id)
-    track_file.audio_file.save(os.path.basename(path), File(open(path, "rb")))
-    track_file.save()
-
-    return track_file
diff --git a/api/funkwhale_api/providers/urls.py b/api/funkwhale_api/providers/urls.py
index 6d001ed9dbd593b59200a43670a871ab3f8916b3..55a1193f503c33784a1876fd6700ab0f28d79041 100644
--- a/api/funkwhale_api/providers/urls.py
+++ b/api/funkwhale_api/providers/urls.py
@@ -1,5 +1,4 @@
 from django.conf.urls import include, url
-from funkwhale_api.music import views
 
 urlpatterns = [
     url(
diff --git a/api/funkwhale_api/providers/youtube/client.py b/api/funkwhale_api/providers/youtube/client.py
index fbc32efa49eca5cbebd0b28b84e01919356e2d10..2235fcdc83a994ea0da1024962e9d6bd45704184 100644
--- a/api/funkwhale_api/providers/youtube/client.py
+++ b/api/funkwhale_api/providers/youtube/client.py
@@ -1,9 +1,6 @@
 import threading
 
 from apiclient.discovery import build
-from apiclient.errors import HttpError
-from oauth2client.tools import argparser
-
 from dynamic_preferences.registries import global_preferences_registry as registry
 
 YOUTUBE_API_SERVICE_NAME = "youtube"
diff --git a/api/funkwhale_api/providers/youtube/dynamic_preferences_registry.py b/api/funkwhale_api/providers/youtube/dynamic_preferences_registry.py
index 42b54b5350e2c9c2bd8a3cfb6e5072cbea68c024..2d950eb6b202f1f728b4f345733488e689261695 100644
--- a/api/funkwhale_api/providers/youtube/dynamic_preferences_registry.py
+++ b/api/funkwhale_api/providers/youtube/dynamic_preferences_registry.py
@@ -1,7 +1,6 @@
 from django import forms
-
-from dynamic_preferences.types import StringPreference, Section
 from dynamic_preferences.registries import global_preferences_registry
+from dynamic_preferences.types import Section, StringPreference
 
 youtube = Section("providers_youtube")
 
diff --git a/api/funkwhale_api/providers/youtube/urls.py b/api/funkwhale_api/providers/youtube/urls.py
index c496a2c69dd441ef262d8a57fc2e734a4c0cb67a..d9687ac9f8f0e1af94eef00868ce7c64dbe3d406 100644
--- a/api/funkwhale_api/providers/youtube/urls.py
+++ b/api/funkwhale_api/providers/youtube/urls.py
@@ -1,6 +1,6 @@
-from django.conf.urls import include, url
-from .views import APISearch, APISearchs
+from django.conf.urls import url
 
+from .views import APISearch, APISearchs
 
 urlpatterns = [
     url(r"^search/$", APISearch.as_view(), name="search"),
diff --git a/api/funkwhale_api/providers/youtube/views.py b/api/funkwhale_api/providers/youtube/views.py
index 012b1825d5620b0e0cbf0e6e5c899755c4d9d712..5e1982f48e80ca5722c5ebbb712151cd12a02eb2 100644
--- a/api/funkwhale_api/providers/youtube/views.py
+++ b/api/funkwhale_api/providers/youtube/views.py
@@ -1,5 +1,6 @@
-from rest_framework.views import APIView
 from rest_framework.response import Response
+from rest_framework.views import APIView
+
 from funkwhale_api.common.permissions import ConditionalAuthentication
 
 from .client import client
diff --git a/api/funkwhale_api/radios/__init__.py b/api/funkwhale_api/radios/__init__.py
index 1258181b5c52430b720cfc558eb44399ce17b0f1..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 100644
--- a/api/funkwhale_api/radios/__init__.py
+++ b/api/funkwhale_api/radios/__init__.py
@@ -1 +0,0 @@
-from .registries import registry
diff --git a/api/funkwhale_api/radios/factories.py b/api/funkwhale_api/radios/factories.py
index 69d6ab6e8e4edd468bc6af66a382a5e5e20ac166..a83c53737a9b174a37fa97ebdb46d13fdea805e5 100644
--- a/api/funkwhale_api/radios/factories.py
+++ b/api/funkwhale_api/radios/factories.py
@@ -24,7 +24,7 @@ class RadioSessionFactory(factory.django.DjangoModelFactory):
 
 
 @registry.register(name="radios.CustomRadioSession")
-class RadioSessionFactory(factory.django.DjangoModelFactory):
+class CustomRadioSessionFactory(factory.django.DjangoModelFactory):
     user = factory.SubFactory(UserFactory)
     radio_type = "custom"
     custom_radio = factory.SubFactory(
diff --git a/api/funkwhale_api/radios/filters.py b/api/funkwhale_api/radios/filters.py
index cb08e46ed2e20ece86c7847fb67339091f627db5..810673bd664f6b7ddf56aee7403a2dfac5445b83 100644
--- a/api/funkwhale_api/radios/filters.py
+++ b/api/funkwhale_api/radios/filters.py
@@ -1,13 +1,11 @@
 import collections
 
+import persisting_theory
 from django.core.exceptions import ValidationError
 from django.db.models import Q
 from django.urls import reverse_lazy
 
-import persisting_theory
-
 from funkwhale_api.music import models
-from funkwhale_api.taskapp.celery import require_instance
 
 
 class RadioFilterRegistry(persisting_theory.Registry):
@@ -177,7 +175,6 @@ class TagFilter(RadioFilter):
             "type": "list",
             "subtype": "string",
             "autocomplete": reverse_lazy("api:v1:tags-list"),
-            "autocomplete_qs": "",
             "autocomplete_fields": {
                 "remoteValues": "results",
                 "name": "name",
diff --git a/api/funkwhale_api/radios/models.py b/api/funkwhale_api/radios/models.py
index af0fa26da2eee26cc968f411f356f8de098338c0..d0c3d1716a4efb3d2698054646abf0db04535b10 100644
--- a/api/funkwhale_api/radios/models.py
+++ b/api/funkwhale_api/radios/models.py
@@ -1,10 +1,9 @@
-from django.db import models
-from django.utils import timezone
-from django.core.exceptions import ValidationError
-from django.contrib.postgres.fields import JSONField
 from django.contrib.contenttypes.fields import GenericForeignKey
 from django.contrib.contenttypes.models import ContentType
+from django.contrib.postgres.fields import JSONField
 from django.core.serializers.json import DjangoJSONEncoder
+from django.db import models
+from django.utils import timezone
 
 from funkwhale_api.music.models import Track
 
@@ -77,7 +76,6 @@ class RadioSession(models.Model):
     @property
     def radio(self):
         from .registries import registry
-        from . import radios
 
         return registry[self.radio_type](session=self)
 
diff --git a/api/funkwhale_api/radios/radios.py b/api/funkwhale_api/radios/radios.py
index f876d03b28730145db23a244fd1890dc51912722..c7c361de9df143074867882caf7068a498b9a0b7 100644
--- a/api/funkwhale_api/radios/radios.py
+++ b/api/funkwhale_api/radios/radios.py
@@ -1,13 +1,14 @@
 import random
-from rest_framework import serializers
-from django.db.models import Count
+
 from django.core.exceptions import ValidationError
+from django.db.models import Count
+from rest_framework import serializers
 from taggit.models import Tag
+
+from funkwhale_api.music.models import Artist, Track
 from funkwhale_api.users.models import User
-from funkwhale_api.music.models import Track, Artist
 
-from . import filters
-from . import models
+from . import filters, models
 from .registries import registry
 
 
@@ -147,7 +148,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/serializers.py b/api/funkwhale_api/radios/serializers.py
index be60bbc3e5cfad69c124ef1a05cf54e58978f6e7..9bffbf5b9cd3ce0c04100dcf3a68de008964b416 100644
--- a/api/funkwhale_api/radios/serializers.py
+++ b/api/funkwhale_api/radios/serializers.py
@@ -3,8 +3,7 @@ from rest_framework import serializers
 from funkwhale_api.music.serializers import TrackSerializer
 from funkwhale_api.users.serializers import UserBasicSerializer
 
-from . import filters
-from . import models
+from . import filters, models
 from .radios import registry
 
 
diff --git a/api/funkwhale_api/radios/urls.py b/api/funkwhale_api/radios/urls.py
index 3f48455b06e1b16a09654e48c9cea786176c0a7c..8b9fd52c8a440d7ec41a8afa1e703f8b2a823143 100644
--- a/api/funkwhale_api/radios/urls.py
+++ b/api/funkwhale_api/radios/urls.py
@@ -1,8 +1,7 @@
-from django.conf.urls import include, url
-from . import views
-
 from rest_framework import routers
 
+from . import views
+
 router = routers.SimpleRouter()
 router.register(r"sessions", views.RadioSessionViewSet, "sessions")
 router.register(r"radios", views.RadioViewSet, "radios")
diff --git a/api/funkwhale_api/radios/views.py b/api/funkwhale_api/radios/views.py
index 1d933a2939ea95cb375f60c7368ca6504a2f71ca..77df238e11006c211544573c3deed9206391d89d 100644
--- a/api/funkwhale_api/radios/views.py
+++ b/api/funkwhale_api/radios/views.py
@@ -1,19 +1,12 @@
 from django.db.models import Q
 from django.http import Http404
-
-from rest_framework import generics, mixins, viewsets
-from rest_framework import permissions
-from rest_framework import status
-from rest_framework.response import Response
+from rest_framework import mixins, permissions, status, viewsets
 from rest_framework.decorators import detail_route, list_route
+from rest_framework.response import Response
 
 from funkwhale_api.music.serializers import TrackSerializer
-from funkwhale_api.common.permissions import ConditionalAuthentication
 
-from . import models
-from . import filters
-from . import filtersets
-from . import serializers
+from . import filters, filtersets, models, serializers
 
 
 class RadioViewSet(
@@ -108,7 +101,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/requests/api_urls.py b/api/funkwhale_api/requests/api_urls.py
index c7c1a103bd1a65c57d8ba987cb788486db50f8c2..403a0953bac9fa4d822466ccc9a286477d57b89b 100644
--- a/api/funkwhale_api/requests/api_urls.py
+++ b/api/funkwhale_api/requests/api_urls.py
@@ -1,8 +1,7 @@
-from django.conf.urls import include, url
-from . import views
-
 from rest_framework import routers
 
+from . import views
+
 router = routers.SimpleRouter()
 router.register(r"import-requests", views.ImportRequestViewSet, "import-requests")
 
diff --git a/api/funkwhale_api/requests/filters.py b/api/funkwhale_api/requests/filters.py
index ad8b000d27babeec15246ff55b0ee1d409a72757..4a06dea1b754f35f830b8cad488fa34ea04e28be 100644
--- a/api/funkwhale_api/requests/filters.py
+++ b/api/funkwhale_api/requests/filters.py
@@ -1,6 +1,7 @@
 import django_filters
 
 from funkwhale_api.common import fields
+
 from . import models
 
 
diff --git a/api/funkwhale_api/requests/models.py b/api/funkwhale_api/requests/models.py
index 650d502407ee013665577ce4191787523f9879c6..a24086d7a695c59e94acc55d76981d486222c2dd 100644
--- a/api/funkwhale_api/requests/models.py
+++ b/api/funkwhale_api/requests/models.py
@@ -1,5 +1,4 @@
 from django.db import models
-
 from django.utils import timezone
 
 NATURE_CHOICES = [("artist", "artist"), ("album", "album"), ("track", "track")]
diff --git a/api/funkwhale_api/requests/views.py b/api/funkwhale_api/requests/views.py
index 4b68555a87fab41a3e5c1524f1fb70e09a1f947a..96d8c89279333b442a7afade7bf53f2022769cd6 100644
--- a/api/funkwhale_api/requests/views.py
+++ b/api/funkwhale_api/requests/views.py
@@ -1,11 +1,6 @@
-from rest_framework import generics, mixins, viewsets
-from rest_framework import status
-from rest_framework.response import Response
-from rest_framework.decorators import detail_route
+from rest_framework import mixins, viewsets
 
-from . import filters
-from . import models
-from . import serializers
+from . import filters, models, serializers
 
 
 class ImportRequestViewSet(
diff --git a/api/funkwhale_api/subsonic/authentication.py b/api/funkwhale_api/subsonic/authentication.py
index 808e5e5ec3a3c2a84c2806027723ca77a5549d39..a573a109249972e5a1e693d2c84edfe66efd0f46 100644
--- a/api/funkwhale_api/subsonic/authentication.py
+++ b/api/funkwhale_api/subsonic/authentication.py
@@ -1,8 +1,7 @@
 import binascii
 import hashlib
 
-from rest_framework import authentication
-from rest_framework import exceptions
+from rest_framework import authentication, exceptions
 
 from funkwhale_api.users.models import User
 
diff --git a/api/funkwhale_api/subsonic/dynamic_preferences_registry.py b/api/funkwhale_api/subsonic/dynamic_preferences_registry.py
index 0916b0a3e9a4f17624f2fc1c81705b868dbfb69b..439d16de39b4eec8cbe3168505e8f11be1bf20b9 100644
--- a/api/funkwhale_api/subsonic/dynamic_preferences_registry.py
+++ b/api/funkwhale_api/subsonic/dynamic_preferences_registry.py
@@ -1,8 +1,6 @@
 from dynamic_preferences import types
 from dynamic_preferences.registries import global_preferences_registry
 
-from funkwhale_api.common import preferences
-
 subsonic = types.Section("subsonic")
 
 
diff --git a/api/funkwhale_api/subsonic/negotiation.py b/api/funkwhale_api/subsonic/negotiation.py
index 2b46b1753006f202d8a633fa461ad0b43f16b40b..96b41589e0aea74ad4eef8be4fe9c21f2d89d5cc 100644
--- a/api/funkwhale_api/subsonic/negotiation.py
+++ b/api/funkwhale_api/subsonic/negotiation.py
@@ -1,9 +1,7 @@
-from rest_framework import exceptions
-from rest_framework import negotiation
+from rest_framework import exceptions, negotiation
 
 from . import renderers
 
-
 MAPPING = {
     "json": (renderers.SubsonicJSONRenderer(), "application/json"),
     "xml": (renderers.SubsonicXMLRenderer(), "text/xml"),
@@ -12,7 +10,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/serializers.py b/api/funkwhale_api/subsonic/serializers.py
index 7735b1a78ecffb4471b9b4b2b3d932acf650fcf4..fc21a99f2aa540024754810d96865638d2a1eb28 100644
--- a/api/funkwhale_api/subsonic/serializers.py
+++ b/api/funkwhale_api/subsonic/serializers.py
@@ -1,7 +1,6 @@
 import collections
 
-from django.db.models import functions, Count
-
+from django.db.models import Count, functions
 from rest_framework import serializers
 
 from funkwhale_api.history import models as history_models
diff --git a/api/funkwhale_api/subsonic/views.py b/api/funkwhale_api/subsonic/views.py
index 85d120a08640b506d7223d5ea4699b308967c8a1..7fb5db0eefc17523e765e3eec51458580b347c62 100644
--- a/api/funkwhale_api/subsonic/views.py
+++ b/api/funkwhale_api/subsonic/views.py
@@ -2,12 +2,9 @@ import datetime
 
 from django.conf import settings
 from django.utils import timezone
-
 from rest_framework import exceptions
 from rest_framework import permissions as rest_permissions
-from rest_framework import renderers
-from rest_framework import response
-from rest_framework import viewsets
+from rest_framework import renderers, response, viewsets
 from rest_framework.decorators import list_route
 from rest_framework.serializers import ValidationError
 
@@ -19,10 +16,7 @@ from funkwhale_api.music import utils
 from funkwhale_api.music import views as music_views
 from funkwhale_api.playlists import models as playlists_models
 
-from . import authentication
-from . import filters
-from . import negotiation
-from . import serializers
+from . import authentication, filters, negotiation, serializers
 
 
 def find_object(queryset, model_field="pk", field="id", cast=int):
@@ -158,7 +152,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)
@@ -463,6 +456,6 @@ class SubsonicViewSet(viewsets.GenericViewSet):
                 {"error": {"code": 0, "message": "Invalid payload"}}
             )
         if serializer.validated_data["submission"]:
-            l = serializer.save()
-            record.send(l)
+            listening = serializer.save()
+            record.send(listening)
         return response.Response({})
diff --git a/api/funkwhale_api/taskapp/celery.py b/api/funkwhale_api/taskapp/celery.py
index 80fb1a60e770f8a209aad24f08694adcb771ef92..98e980f07273c640c08871bf8de0c42abcd344a1 100644
--- a/api/funkwhale_api/taskapp/celery.py
+++ b/api/funkwhale_api/taskapp/celery.py
@@ -1,13 +1,13 @@
 
 from __future__ import absolute_import
-import os
+
 import functools
+import os
 
 from celery import Celery
 from django.apps import AppConfig
 from django.conf import settings
 
-
 if not settings.configured:
     # set the default Django settings module for the 'celery' program.
     os.environ.setdefault(
diff --git a/api/funkwhale_api/users/adapters.py b/api/funkwhale_api/users/adapters.py
index 6916975703ce2bb0a264e3b50ee1a7b57a4df938..6d8c365d52be08db4551dc05044dd6cbb63cfa06 100644
--- a/api/funkwhale_api/users/adapters.py
+++ b/api/funkwhale_api/users/adapters.py
@@ -1,6 +1,5 @@
-from django.conf import settings
-
 from allauth.account.adapter import DefaultAccountAdapter
+from django.conf import settings
 from dynamic_preferences.registries import global_preferences_registry
 
 
diff --git a/api/funkwhale_api/users/api_urls.py b/api/funkwhale_api/users/api_urls.py
index dacb091f1d76d1a100b47eb44a020fcaf2fa3c71..267ee2d69ad6dc1dd9d1b874072e415a9bdda41d 100644
--- a/api/funkwhale_api/users/api_urls.py
+++ b/api/funkwhale_api/users/api_urls.py
@@ -1,4 +1,5 @@
 from rest_framework import routers
+
 from . import views
 
 router = routers.SimpleRouter()
diff --git a/api/funkwhale_api/users/factories.py b/api/funkwhale_api/users/factories.py
index 949bfdfe40365dba112e55fa7932440bfa7f5280..eed8c7175a2dacdb65404aaf827c2bee04582dbb 100644
--- a/api/funkwhale_api/users/factories.py
+++ b/api/funkwhale_api/users/factories.py
@@ -1,8 +1,8 @@
 import factory
-
-from funkwhale_api.factories import registry, ManyToManyFromList
 from django.contrib.auth.models import Permission
 
+from funkwhale_api.factories import ManyToManyFromList, registry
+
 
 @registry.register
 class GroupFactory(factory.django.DjangoModelFactory):
diff --git a/api/funkwhale_api/users/models.py b/api/funkwhale_api/users/models.py
index 281fc4fe8da8fc140989e8aa2f861af8d3b918eb..caf1e452bbcab42ff52587a50d35c6039fdf132c 100644
--- a/api/funkwhale_api/users/models.py
+++ b/api/funkwhale_api/users/models.py
@@ -1,19 +1,18 @@
 # -*- coding: utf-8 -*-
-from __future__ import unicode_literals, absolute_import
+from __future__ import absolute_import, unicode_literals
 
 import binascii
 import os
 import uuid
 
 from django.conf import settings
-from django.contrib.auth.models import AbstractUser, Permission
-from django.urls import reverse
+from django.contrib.auth.models import AbstractUser
 from django.db import models
+from django.urls import reverse
 from django.utils.encoding import python_2_unicode_compatible
 from django.utils.translation import ugettext_lazy as _
 
-from funkwhale_api.common import fields
-from funkwhale_api.common import preferences
+from funkwhale_api.common import fields, preferences
 
 
 def get_token():
@@ -91,7 +90,8 @@ class User(AbstractUser):
             perms[p] = v
         return perms
 
-    def has_permissions(self, *perms, operator="and"):
+    def has_permissions(self, *perms, **kwargs):
+        operator = kwargs.pop("operator", "and")
         if operator not in ["and", "or"]:
             raise ValueError("Invalid operator {}".format(operator))
         permissions = self.get_permissions()
diff --git a/api/funkwhale_api/users/rest_auth_urls.py b/api/funkwhale_api/users/rest_auth_urls.py
index f5015ecbda49030cc71046f0421161e61955822f..732a3bbbcead15c5603f16872a97c6703dcbecca 100644
--- a/api/funkwhale_api/users/rest_auth_urls.py
+++ b/api/funkwhale_api/users/rest_auth_urls.py
@@ -1,12 +1,10 @@
-from django.views.generic import TemplateView
 from django.conf.urls import url
-
-from rest_auth.registration import views as registration_views
+from django.views.generic import TemplateView
 from rest_auth import views as rest_auth_views
+from rest_auth.registration import views as registration_views
 
 from . import views
 
-
 urlpatterns = [
     url(r"^$", views.RegisterView.as_view(), name="rest_register"),
     url(
diff --git a/api/funkwhale_api/users/serializers.py b/api/funkwhale_api/users/serializers.py
index ab289bc5155e3c8ffc42d6d07a67db6d37bce6a2..b3bd431c722fc5f8e4751270a9b1690973119de2 100644
--- a/api/funkwhale_api/users/serializers.py
+++ b/api/funkwhale_api/users/serializers.py
@@ -1,7 +1,7 @@
 from django.conf import settings
-
-from rest_framework import serializers
 from rest_auth.serializers import PasswordResetSerializer as PRS
+from rest_framework import serializers
+
 from funkwhale_api.activity import serializers as activity_serializers
 
 from . import models
diff --git a/api/funkwhale_api/users/views.py b/api/funkwhale_api/users/views.py
index dfb71dd0585847c3015eea42ac27b6bc482492bf..69e69d26e6b987426ef59a450d07e3d6458f6ab2 100644
--- a/api/funkwhale_api/users/views.py
+++ b/api/funkwhale_api/users/views.py
@@ -1,15 +1,12 @@
-from rest_framework.response import Response
-from rest_framework import mixins
-from rest_framework import viewsets
-from rest_framework.decorators import detail_route, list_route
-
-from rest_auth.registration.views import RegisterView as BaseRegisterView
 from allauth.account.adapter import get_adapter
+from rest_auth.registration.views import RegisterView as BaseRegisterView
+from rest_framework import mixins, viewsets
+from rest_framework.decorators import detail_route, list_route
+from rest_framework.response import Response
 
 from funkwhale_api.common import preferences
 
-from . import models
-from . import serializers
+from . import models, serializers
 
 
 class RegisterView(BaseRegisterView):
diff --git a/api/requirements/local.txt b/api/requirements/local.txt
index c5f2ad0b7f7921a3af127f971f93eb4a3c80ad30..f11f976b8b165a1fff0fa219fd921a1644ff9084 100644
--- a/api/requirements/local.txt
+++ b/api/requirements/local.txt
@@ -9,3 +9,4 @@ django-debug-toolbar>=1.9,<1.10
 
 # improved REPL
 ipdb==0.8.1
+black
diff --git a/api/setup.cfg b/api/setup.cfg
index b1267c904cc94dc623dddf93c9af1293ec869122..18e34bc3543290d54135c6757f1a64ca6c560c5c 100644
--- a/api/setup.cfg
+++ b/api/setup.cfg
@@ -1,6 +1,10 @@
 [flake8]
 max-line-length = 120
-exclude = .tox,.git,*/migrations/*,*/static/CACHE/*,docs,node_modules
+exclude = .tox,.git,*/migrations/*,*/static/CACHE/*,docs,node_modules,tests/data,tests/music/conftest.py
+ignore = F405,W503,E203
+
+[isort]
+skip_glob = .tox,.git,*/migrations/*,*/static/CACHE/*,docs,node_modules
 
 [pep8]
 max-line-length = 120
diff --git a/api/tests/activity/test_record.py b/api/tests/activity/test_record.py
index 98cefaba213585f1dcae5c05cc3199dfd33e7b58..69d3a28cfa5ec0b325025a0d1bfcf5548a6bfaf5 100644
--- a/api/tests/activity/test_record.py
+++ b/api/tests/activity/test_record.py
@@ -1,4 +1,3 @@
-import pytest
 
 from django.db import models
 from rest_framework import serializers
diff --git a/api/tests/activity/test_utils.py b/api/tests/activity/test_utils.py
index b12e3d0cb3ff92df788cd5f4160dbb56e40bab4b..0dabd3a28518b36134993bde1a21a3f070cf6d79 100644
--- a/api/tests/activity/test_utils.py
+++ b/api/tests/activity/test_utils.py
@@ -11,9 +11,9 @@ def test_get_activity(factories):
 
 
 def test_get_activity_honors_privacy_level(factories, anonymous_user):
-    listening = factories["history.Listening"](user__privacy_level="me")
+    factories["history.Listening"](user__privacy_level="me")
     favorite1 = factories["favorites.TrackFavorite"](user__privacy_level="everyone")
-    favorite2 = factories["favorites.TrackFavorite"](user__privacy_level="instance")
+    factories["favorites.TrackFavorite"](user__privacy_level="instance")
 
     objects = list(utils.get_activity(anonymous_user))
     assert objects == [favorite1]
diff --git a/api/tests/activity/test_views.py b/api/tests/activity/test_views.py
index 188039e664db3e89e8a2da6ff0d7d7bc1c509056..1f5efae51377ad6bb4ce1dd8267d698c07049826 100644
--- a/api/tests/activity/test_views.py
+++ b/api/tests/activity/test_views.py
@@ -1,13 +1,12 @@
 from django.urls import reverse
 
-from funkwhale_api.activity import serializers
-from funkwhale_api.activity import utils
+from funkwhale_api.activity import serializers, 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["favorites.TrackFavorite"](user__privacy_level="everyone")
+    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/channels/test_auth.py b/api/tests/channels/test_auth.py
index 19bdebe6824d26bd1d39548ce7ab709bb1a91bfd..505bef1c0761cd972f40f7b4cf09e14cd1fcb627 100644
--- a/api/tests/channels/test_auth.py
+++ b/api/tests/channels/test_auth.py
@@ -1,5 +1,4 @@
 import pytest
-
 from rest_framework_jwt.settings import api_settings
 
 from funkwhale_api.common.auth import TokenAuthMiddleware
diff --git a/api/tests/common/test_fields.py b/api/tests/common/test_fields.py
index bd836f840bd85fdd43ea286e1bc952b67087de0a..d2692314854c3c6761974789ed82f96132beb9dd 100644
--- a/api/tests/common/test_fields.py
+++ b/api/tests/common/test_fields.py
@@ -1,5 +1,4 @@
 import pytest
-
 from django.contrib.auth.models import AnonymousUser
 from django.db.models import Q
 
diff --git a/api/tests/common/test_permissions.py b/api/tests/common/test_permissions.py
index 952ec589e7abc00165de5cf46ef627a2f9f687b8..bf4d8bde5cd3b918030befd43bca81402ce72abd 100644
--- a/api/tests/common/test_permissions.py
+++ b/api/tests/common/test_permissions.py
@@ -1,8 +1,6 @@
 import pytest
-
-from rest_framework.views import APIView
-
 from django.http import Http404
+from rest_framework.views import APIView
 
 from funkwhale_api.common import permissions
 
diff --git a/api/tests/common/test_preferences.py b/api/tests/common/test_preferences.py
index 5ea398c87fbeb75ae4f1c2a72adcef4d61205c06..7f941a45006be86550c8622bde019be61ebb0abc 100644
--- a/api/tests/common/test_preferences.py
+++ b/api/tests/common/test_preferences.py
@@ -1,6 +1,6 @@
 import pytest
-
 from dynamic_preferences.registries import global_preferences_registry
+
 from funkwhale_api.common import preferences as common_preferences
 
 
@@ -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_scripts.py b/api/tests/common/test_scripts.py
index afedc3e3a38a5892d48345897c6300fa2a2deb55..40d9ea0a7aae1f18611a74e956bcd2ac5d77dbdd 100644
--- a/api/tests/common/test_scripts.py
+++ b/api/tests/common/test_scripts.py
@@ -1,7 +1,7 @@
 import pytest
 
-from funkwhale_api.common.management.commands import script
 from funkwhale_api.common import scripts
+from funkwhale_api.common.management.commands import script
 
 
 @pytest.fixture
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/common/test_session.py b/api/tests/common/test_session.py
index eba26dae012e58a7f31cbe60122e966d736b3eb0..531543455d43cb92268ea196f15c1fcdd9472d6f 100644
--- a/api/tests/common/test_session.py
+++ b/api/tests/common/test_session.py
@@ -1,5 +1,4 @@
 import funkwhale_api
-
 from funkwhale_api.common import session
 
 
diff --git a/api/tests/conftest.py b/api/tests/conftest.py
index 080e1a927a61b74188a5b15b927bc3de97e541a5..40203ee3d472693d7304d92ab68094949535fab9 100644
--- a/api/tests/conftest.py
+++ b/api/tests/conftest.py
@@ -1,23 +1,19 @@
 import datetime
-import factory
-import pytest
-import requests_mock
 import shutil
 import tempfile
 
+import factory
+import pytest
+import requests_mock
 from django.contrib.auth.models import AnonymousUser
 from django.core.cache import cache as django_cache
 from django.test import client
-
 from dynamic_preferences.registries import global_preferences_registry
-
 from rest_framework import fields as rest_fields
-from rest_framework.test import APIClient
-from rest_framework.test import APIRequestFactory
+from rest_framework.test import APIClient, APIRequestFactory
 
 from funkwhale_api.activity import record
 from funkwhale_api.users.permissions import HasUserPermission
-from funkwhale_api.taskapp import celery
 
 
 @pytest.fixture(scope="session", autouse=True)
@@ -186,7 +182,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/data/youtube.py b/api/tests/data/youtube.py
index d3303d2ad1234723bbab08ebad8315a45ce92916..9c8f9e68f16c55a815ebab45bf5d732143efbc28 100644
--- a/api/tests/data/youtube.py
+++ b/api/tests/data/youtube.py
@@ -1,5 +1,3 @@
-
-
 search = {}
 
 
@@ -13,7 +11,7 @@ search["8 bit adventure"] = {
             "etag": '"gMxXHe-zinKdE9lTnzKu8vjcmDI/GxK-wHBWUYfrJsd1dijBPTufrVE"',
             "snippet": {
                 "liveBroadcastContent": "none",
-                "description": "Make sure to apply adhesive evenly before use. GET IT HERE: http://adhesivewombat.bandcamp.com/album/marsupial-madness Facebook: ...",
+                "description": "Description",
                 "channelId": "UCps63j3krzAG4OyXeEyuhFw",
                 "title": "AdhesiveWombat - 8 Bit Adventure",
                 "channelTitle": "AdhesiveWombat",
diff --git a/api/tests/favorites/test_activity.py b/api/tests/favorites/test_activity.py
index a6eff99912d7ad69d030349ec31e812af886b4bb..e4c040b20e9025f0f5293131d6ba7e09f9972265 100644
--- a/api/tests/favorites/test_activity.py
+++ b/api/tests/favorites/test_activity.py
@@ -1,7 +1,6 @@
-from funkwhale_api.users.serializers import UserActivitySerializer
+from funkwhale_api.favorites import activities, serializers
 from funkwhale_api.music.serializers import TrackActivitySerializer
-from funkwhale_api.favorites import serializers
-from funkwhale_api.favorites import activities
+from funkwhale_api.users.serializers import UserActivitySerializer
 
 
 def test_get_favorite_activity_url(settings, factories):
@@ -56,6 +55,5 @@ def test_broadcast_track_favorite_to_instance_activity_private(factories, mocker
     favorite = factories["favorites.TrackFavorite"](user__privacy_level="me")
     data = serializers.TrackFavoriteActivitySerializer(favorite).data
     consumer = activities.broadcast_track_favorite_to_instance_activity
-    message = {"type": "event.send", "text": "", "data": data}
     consumer(data=data, obj=favorite)
     p.assert_not_called()
diff --git a/api/tests/favorites/test_favorites.py b/api/tests/favorites/test_favorites.py
index 345c24bdee58c2e287e0a63aab8373c6f740cbb3..cd75b0d26e3bf77a866eea745105a41642bcf828 100644
--- a/api/tests/favorites/test_favorites.py
+++ b/api/tests/favorites/test_favorites.py
@@ -1,8 +1,8 @@
 import json
+
 import pytest
 from django.urls import reverse
 
-from funkwhale_api.music.models import Track, Artist
 from funkwhale_api.favorites.models import TrackFavorite
 
 
diff --git a/api/tests/federation/test_activity.py b/api/tests/federation/test_activity.py
index 8e9000ce013cf21c1df7bc3545d9e064e460002c..9c7bb70ecc43400215119a2cef9f8403c6a02783 100644
--- a/api/tests/federation/test_activity.py
+++ b/api/tests/federation/test_activity.py
@@ -1,7 +1,5 @@
-import uuid
 
-from funkwhale_api.federation import activity
-from funkwhale_api.federation import serializers
+from funkwhale_api.federation import activity, serializers
 
 
 def test_deliver(factories, r_mock, mocker, settings):
diff --git a/api/tests/federation/test_actors.py b/api/tests/federation/test_actors.py
index 99c71b34820ac8f9f6f0656464d3436547f74940..736ec8bf2fb9ea6f4d2a0dd01cd2b8ff326c349a 100644
--- a/api/tests/federation/test_actors.py
+++ b/api/tests/federation/test_actors.py
@@ -1,17 +1,10 @@
 import arrow
 import pytest
-import uuid
-
 from django.urls import reverse
 from django.utils import timezone
-
 from rest_framework import exceptions
 
-from funkwhale_api.federation import activity
-from funkwhale_api.federation import actors
-from funkwhale_api.federation import models
-from funkwhale_api.federation import serializers
-from funkwhale_api.federation import utils
+from funkwhale_api.federation import actors, models, serializers, utils
 from funkwhale_api.music import models as music_models
 from funkwhale_api.music import tasks as music_tasks
 
@@ -55,9 +48,7 @@ def test_get_actor_refresh(factories, preferences, mocker):
     payload = serializers.ActorSerializer(actor).data
     # actor changed their username in the meantime
     payload["preferredUsername"] = "New me"
-    get_data = mocker.patch(
-        "funkwhale_api.federation.actors.get_actor_data", return_value=payload
-    )
+    mocker.patch("funkwhale_api.federation.actors.get_actor_data", return_value=payload)
     new_actor = actors.get_actor(actor.url)
 
     assert new_actor == actor
@@ -66,7 +57,7 @@ def test_get_actor_refresh(factories, preferences, mocker):
 
 
 def test_get_library(db, settings, mocker):
-    get_key_pair = mocker.patch(
+    mocker.patch(
         "funkwhale_api.federation.keys.get_key_pair",
         return_value=(b"private", b"public"),
     )
@@ -99,7 +90,7 @@ def test_get_library(db, settings, mocker):
 
 
 def test_get_test(db, mocker, settings):
-    get_key_pair = mocker.patch(
+    mocker.patch(
         "funkwhale_api.federation.keys.get_key_pair",
         return_value=(b"private", b"public"),
     )
@@ -247,7 +238,7 @@ def test_actor_is_system(username, domain, expected, nodb_factories, settings):
         ("test", "", actors.SYSTEM_ACTORS["test"]),
     ],
 )
-def test_actor_is_system(username, domain, expected, nodb_factories, settings):
+def test_actor_system_conf(username, domain, expected, nodb_factories, settings):
     if not domain:
         domain = settings.FEDERATION_HOSTNAME
     actor = nodb_factories["federation.Actor"](
@@ -350,7 +341,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_authentication.py b/api/tests/federation/test_authentication.py
index 566a3368dd0e65fa9558096346c9e6e918b27e4b..95cec5d2ac80d94a7b04de1dd5121c3d270b883b 100644
--- a/api/tests/federation/test_authentication.py
+++ b/api/tests/federation/test_authentication.py
@@ -1,6 +1,4 @@
-from funkwhale_api.federation import authentication
-from funkwhale_api.federation import keys
-from funkwhale_api.federation import signing
+from funkwhale_api.federation import authentication, keys
 
 
 def test_authenticate(factories, mocker, api_request):
diff --git a/api/tests/federation/test_library.py b/api/tests/federation/test_library.py
index 8b2b1850046bd0220ea6b452ebc6d42a37a15fe7..4e187e4792005e82cfe18cf9a066d31a10f8bbd3 100644
--- a/api/tests/federation/test_library.py
+++ b/api/tests/federation/test_library.py
@@ -1,5 +1,4 @@
-from funkwhale_api.federation import library
-from funkwhale_api.federation import serializers
+from funkwhale_api.federation import library, serializers
 
 
 def test_library_scan_from_account_name(mocker, factories):
diff --git a/api/tests/federation/test_models.py b/api/tests/federation/test_models.py
index be353cb670a3e7c2103a056559923c532561ecc2..61d0aea96dc9c66a3a96ce47230d62ceef6e5e57 100644
--- a/api/tests/federation/test_models.py
+++ b/api/tests/federation/test_models.py
@@ -1,11 +1,6 @@
 import pytest
-import uuid
-
 from django import db
 
-from funkwhale_api.federation import models
-from funkwhale_api.federation import serializers
-
 
 def test_cannot_duplicate_actor(factories):
     actor = factories["federation.Actor"]()
diff --git a/api/tests/federation/test_permissions.py b/api/tests/federation/test_permissions.py
index 15990ca9168cfa42114cf025e1f33c61ba12da68..75f76077cf4828049245e82a553f61e11e1e496b 100644
--- a/api/tests/federation/test_permissions.py
+++ b/api/tests/federation/test_permissions.py
@@ -1,7 +1,6 @@
 from rest_framework.views import APIView
 
-from funkwhale_api.federation import actors
-from funkwhale_api.federation import permissions
+from funkwhale_api.federation import actors, permissions
 
 
 def test_library_follower(factories, api_request, anonymous_user, preferences):
diff --git a/api/tests/federation/test_serializers.py b/api/tests/federation/test_serializers.py
index ffcbd441df5608cba28fbe6543c580b6686446cd..e966d1711ba3f4f847a7b081560a9901f610b67f 100644
--- a/api/tests/federation/test_serializers.py
+++ b/api/tests/federation/test_serializers.py
@@ -1,14 +1,8 @@
 import arrow
 import pytest
-
-from django.urls import reverse
 from django.core.paginator import Paginator
 
-from funkwhale_api.federation import actors
-from funkwhale_api.federation import keys
-from funkwhale_api.federation import models
-from funkwhale_api.federation import serializers
-from funkwhale_api.federation import utils
+from funkwhale_api.federation import actors, models, serializers, utils
 
 
 def test_actor_serializer_from_ap(db):
@@ -168,7 +162,7 @@ def test_follow_serializer_save(factories):
     actor = factories["federation.Actor"]()
     target = factories["federation.Actor"]()
 
-    data = expected = {
+    data = {
         "id": "https://test.follow",
         "type": "Follow",
         "actor": actor.url,
@@ -191,7 +185,7 @@ def test_follow_serializer_save_validates_on_context(factories):
     target = factories["federation.Actor"]()
     impostor = factories["federation.Actor"]()
 
-    data = expected = {
+    data = {
         "id": "https://test.follow",
         "type": "Follow",
         "actor": actor.url,
diff --git a/api/tests/federation/test_signing.py b/api/tests/federation/test_signing.py
index e88425e8f35de101a6d78a5b87e9f7227f57fcf3..159f31cd96fdce747cd48120d4999940de5dd66c 100644
--- a/api/tests/federation/test_signing.py
+++ b/api/tests/federation/test_signing.py
@@ -1,10 +1,7 @@
 import cryptography.exceptions
-import io
 import pytest
-import requests_http_signature
 
-from funkwhale_api.federation import signing
-from funkwhale_api.federation import keys
+from funkwhale_api.federation import keys, signing
 
 
 def test_can_sign_and_verify_request(nodb_factories):
diff --git a/api/tests/federation/test_tasks.py b/api/tests/federation/test_tasks.py
index f6fafffd6082127169df8bbd626dbd7d621f0ec9..bc10eae9564cb4a6ae89882ba6478c92ad9137fd 100644
--- a/api/tests/federation/test_tasks.py
+++ b/api/tests/federation/test_tasks.py
@@ -1,13 +1,11 @@
 import datetime
 import os
 import pathlib
-import pytest
 
 from django.core.paginator import Paginator
 from django.utils import timezone
 
-from funkwhale_api.federation import serializers
-from funkwhale_api.federation import tasks
+from funkwhale_api.federation import serializers, tasks
 
 
 def test_scan_library_does_nothing_if_federation_disabled(mocker, factories):
@@ -111,11 +109,11 @@ def test_clean_federation_music_cache_if_no_listen(preferences, factories):
     lt1 = factories["federation.LibraryTrack"](with_audio_file=True)
     lt2 = factories["federation.LibraryTrack"](with_audio_file=True)
     lt3 = factories["federation.LibraryTrack"](with_audio_file=True)
-    tf1 = factories["music.TrackFile"](accessed_date=timezone.now(), library_track=lt1)
-    tf2 = factories["music.TrackFile"](
+    factories["music.TrackFile"](accessed_date=timezone.now(), library_track=lt1)
+    factories["music.TrackFile"](
         accessed_date=timezone.now() - datetime.timedelta(minutes=61), library_track=lt2
     )
-    tf3 = factories["music.TrackFile"](accessed_date=None, library_track=lt3)
+    factories["music.TrackFile"](accessed_date=None, library_track=lt3)
     path1 = lt1.audio_file.path
     path2 = lt2.audio_file.path
     path3 = lt3.audio_file.path
@@ -146,7 +144,7 @@ def test_clean_federation_music_cache_orphaned(settings, preferences, factories)
     lt = factories["federation.LibraryTrack"](
         with_audio_file=True, audio_file__path=keep_path
     )
-    tf = factories["music.TrackFile"](library_track=lt, accessed_date=timezone.now())
+    factories["music.TrackFile"](library_track=lt, accessed_date=timezone.now())
 
     tasks.clean_music_cache()
 
diff --git a/api/tests/federation/test_views.py b/api/tests/federation/test_views.py
index 2b0e47cdb112911fb66ccfba681afb229d60cdcf..9e2d66a620241d384ca1546c690c2836f4820c1a 100644
--- a/api/tests/federation/test_views.py
+++ b/api/tests/federation/test_views.py
@@ -1,16 +1,17 @@
+import pytest
 from django.core.paginator import Paginator
 from django.urls import reverse
 from django.utils import timezone
 
-import pytest
-
-from funkwhale_api.federation import actors
-from funkwhale_api.federation import activity
-from funkwhale_api.federation import models
-from funkwhale_api.federation import serializers
-from funkwhale_api.federation import utils
-from funkwhale_api.federation import views
-from funkwhale_api.federation import webfinger
+from funkwhale_api.federation import (
+    activity,
+    actors,
+    models,
+    serializers,
+    utils,
+    views,
+    webfinger,
+)
 
 
 @pytest.mark.parametrize(
@@ -159,8 +160,7 @@ 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)
+    factories["music.TrackFile"].create_batch(size=5, federation=True)
 
     url = reverse("federation:music:files-list")
     response = api_client.get(url)
@@ -188,7 +188,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 +262,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)
@@ -274,7 +273,7 @@ def test_can_list_system_actor_following(factories, superuser_api_client):
 
 def test_can_list_system_actor_followers(factories, superuser_api_client):
     library_actor = actors.SYSTEM_ACTORS["library"].get_actor_instance()
-    follow1 = factories["federation.Follow"](actor=library_actor)
+    factories["federation.Follow"](actor=library_actor)
     follow2 = factories["federation.Follow"](target=library_actor)
 
     url = reverse("api:v1:federation:libraries-followers")
@@ -384,7 +383,7 @@ def test_can_update_follow_status(factories, superuser_api_client, mocker):
 
 def test_can_filter_pending_follows(factories, superuser_api_client):
     library_actor = actors.SYSTEM_ACTORS["library"].get_actor_instance()
-    follow = factories["federation.Follow"](target=library_actor, approved=True)
+    factories["federation.Follow"](target=library_actor, approved=True)
 
     params = {"pending": True}
     url = reverse("api:v1:federation:libraries-followers")
@@ -398,7 +397,7 @@ def test_library_track_action_import(factories, superuser_api_client, mocker):
     lt1 = factories["federation.LibraryTrack"]()
     lt2 = factories["federation.LibraryTrack"](library=lt1.library)
     lt3 = factories["federation.LibraryTrack"]()
-    lt4 = factories["federation.LibraryTrack"](library=lt3.library)
+    factories["federation.LibraryTrack"](library=lt3.library)
     mocked_run = mocker.patch("funkwhale_api.music.tasks.import_batch_run.delay")
 
     payload = {
diff --git a/api/tests/federation/test_webfinger.py b/api/tests/federation/test_webfinger.py
index 1b7db92789339ca1eac3f75c14b463a6686b7a54..0608df3e2b38ffecc00d016c99c226da9d8b2705 100644
--- a/api/tests/federation/test_webfinger.py
+++ b/api/tests/federation/test_webfinger.py
@@ -1,7 +1,5 @@
 import pytest
-
 from django import forms
-from django.urls import reverse
 
 from funkwhale_api.federation import webfinger
 
diff --git a/api/tests/history/test_activity.py b/api/tests/history/test_activity.py
index c3cca5925e3526e36df1b9bd0ae4dca68746c772..f3ada50522d9bbd73943137a0f90ffe654b4002e 100644
--- a/api/tests/history/test_activity.py
+++ b/api/tests/history/test_activity.py
@@ -1,7 +1,6 @@
-from funkwhale_api.users.serializers import UserActivitySerializer
+from funkwhale_api.history import activities, serializers
 from funkwhale_api.music.serializers import TrackActivitySerializer
-from funkwhale_api.history import serializers
-from funkwhale_api.history import activities
+from funkwhale_api.users.serializers import UserActivitySerializer
 
 
 def test_get_listening_activity_url(settings, factories):
@@ -56,6 +55,5 @@ def test_broadcast_listening_to_instance_activity_private(factories, mocker):
     listening = factories["history.Listening"](user__privacy_level="me")
     data = serializers.ListeningActivitySerializer(listening).data
     consumer = activities.broadcast_listening_to_instance_activity
-    message = {"type": "event.send", "text": "", "data": data}
     consumer(data=data, obj=listening)
     p.assert_not_called()
diff --git a/api/tests/history/test_history.py b/api/tests/history/test_history.py
index 016c2a98786b4c5dc4b2520f99e95bb1bf85d607..9cc4e3d1471dbc310f354a872e2707a71fc64fb3 100644
--- a/api/tests/history/test_history.py
+++ b/api/tests/history/test_history.py
@@ -1,8 +1,4 @@
-import random
-import json
 from django.urls import reverse
-from django.core.exceptions import ValidationError
-from django.utils import timezone
 
 from funkwhale_api.history import models
 
@@ -10,8 +6,7 @@ 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)
+    models.Listening.objects.create(user=user, track=track)
 
 
 def test_logged_in_user_can_create_listening_via_api(
@@ -20,7 +15,7 @@ def test_logged_in_user_can_create_listening_via_api(
     track = factories["music.Track"]()
 
     url = reverse("api:v1:history:listenings-list")
-    response = logged_in_client.post(url, {"track": track.pk})
+    logged_in_client.post(url, {"track": track.pk})
 
     listening = models.Listening.objects.latest("id")
 
@@ -34,7 +29,7 @@ def test_adding_listening_calls_activity_record(
     track = factories["music.Track"]()
 
     url = reverse("api:v1:history:listenings-list")
-    response = logged_in_client.post(url, {"track": track.pk})
+    logged_in_client.post(url, {"track": track.pk})
 
     listening = models.Listening.objects.latest("id")
 
diff --git a/api/tests/instance/test_nodeinfo.py b/api/tests/instance/test_nodeinfo.py
index 3c2fa862ee17e68d0344fa83562d28958b1a8d69..181ddf2772f3af2cb838e84ebf7718c8cb82eddd 100644
--- a/api/tests/instance/test_nodeinfo.py
+++ b/api/tests/instance/test_nodeinfo.py
@@ -1,7 +1,5 @@
-from django.urls import reverse
 
 import funkwhale_api
-
 from funkwhale_api.instance import nodeinfo
 
 
diff --git a/api/tests/instance/test_preferences.py b/api/tests/instance/test_preferences.py
index 85932145b51fb0c275620f8e7b5f59b5518686b9..b465be9d38571bef6513204922001b6c3dd869b1 100644
--- a/api/tests/instance/test_preferences.py
+++ b/api/tests/instance/test_preferences.py
@@ -1,9 +1,6 @@
 import pytest
-
 from django.urls import reverse
 
-from dynamic_preferences.api import serializers
-
 
 def test_can_list_settings_via_api(preferences, api_client):
     url = reverse("api:v1:instance:settings")
diff --git a/api/tests/instance/test_stats.py b/api/tests/instance/test_stats.py
index 9e60d1cdd4e0677c04bf77963ecf6398b32868e8..1d8bcfc0ad29a26992b22d9ca3b5cb93207f47c6 100644
--- a/api/tests/instance/test_stats.py
+++ b/api/tests/instance/test_stats.py
@@ -1,5 +1,3 @@
-from django.urls import reverse
-
 from funkwhale_api.instance import stats
 
 
@@ -55,7 +53,7 @@ def test_get(mocker):
         "listenings",
         "music_duration",
     ]
-    mocks = [
+    [
         mocker.patch.object(stats, "get_{}".format(k), return_value=i)
         for i, k in enumerate(keys)
     ]
diff --git a/api/tests/instance/test_views.py b/api/tests/instance/test_views.py
index dc9de2a8c636e92b747fddae04ad71d600e27e34..6dd4f6345afebaf91dc001d0b408fb31ae83bbda 100644
--- a/api/tests/instance/test_views.py
+++ b/api/tests/instance/test_views.py
@@ -1,5 +1,4 @@
 import pytest
-
 from django.urls import reverse
 
 from funkwhale_api.instance import views
@@ -12,9 +11,7 @@ def test_permissions(assert_user_permission, view, permissions):
 
 def test_nodeinfo_endpoint(db, api_client, mocker):
     payload = {"test": "test"}
-    mocked_nodeinfo = mocker.patch(
-        "funkwhale_api.instance.nodeinfo.get", return_value=payload
-    )
+    mocker.patch("funkwhale_api.instance.nodeinfo.get", return_value=payload)
     url = reverse("api:v1:instance:nodeinfo-2.0")
     response = api_client.get(url)
     ct = "application/json; profile=http://nodeinfo.diaspora.software/ns/schema/2.0#; charset=utf-8"  # noqa
diff --git a/api/tests/manage/test_views.py b/api/tests/manage/test_views.py
index aa8347f763aa9b14e1b491650b10a7c5f2bbd39b..e2bfbf3a81511dbf313cd630e1d1353840e38b83 100644
--- a/api/tests/manage/test_views.py
+++ b/api/tests/manage/test_views.py
@@ -1,9 +1,7 @@
 import pytest
-
 from django.urls import reverse
 
-from funkwhale_api.manage import serializers
-from funkwhale_api.manage import views
+from funkwhale_api.manage import serializers, views
 
 
 @pytest.mark.parametrize(
diff --git a/api/tests/music/conftest.py b/api/tests/music/conftest.py
index 8108b1a49944695544cddfca02d7035ab582c8d4..0cb6f4778765365530b45a95716ae0f07a2d906f 100644
--- a/api/tests/music/conftest.py
+++ b/api/tests/music/conftest.py
@@ -1,6 +1,5 @@
 import pytest
 
-
 _artists = {"search": {}, "get": {}}
 
 _artists["search"]["adhesive_wombat"] = {
@@ -618,7 +617,7 @@ def lyricswiki_content():
 <head>
 
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-	<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes">
+<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes">
 <meta name="generator" content="MediaWiki 1.19.24" />
 <meta name="keywords" content="Chop Suey! lyrics,System Of A Down Chop Suey! lyrics,Chop Suey! by System Of A Down lyrics,lyrics,LyricWiki,LyricWikia,lyricwiki,System Of A Down:Chop Suey!,System Of A Down,System Of A Down:Toxicity (2001),Enter Shikari,Enter Shikari:Chop Suey!,&quot;Weird Al&quot; Yankovic,&quot;Weird Al&quot; Yankovic:Angry White Boy Polka,Renard,Renard:Physicality,System Of A Down:Chop Suey!/pt,Daron Malakian" />
 <meta name="description" content="Chop Suey! This song is by System of a Down and appears on the album Toxicity (2001)." />
diff --git a/api/tests/music/test_activity.py b/api/tests/music/test_activity.py
index 0d9879300c8fc1279260b2a76be63deac7f97488..8c119394d620b28eac7a594a89bae552e968c3ad 100644
--- a/api/tests/music/test_activity.py
+++ b/api/tests/music/test_activity.py
@@ -1,7 +1,3 @@
-from funkwhale_api.users.serializers import UserActivitySerializer
-from funkwhale_api.favorites import serializers
-
-
 def test_get_track_activity_url_mbid(factories):
     track = factories["music.Track"]()
     expected = "https://musicbrainz.org/recording/{}".format(track.mbid)
diff --git a/api/tests/music/test_api.py b/api/tests/music/test_api.py
index d7d37bd4b1fb81bd4e415011a00e32707c1dfbc4..29a712ce6218db293947e98897dc287710b22d58 100644
--- a/api/tests/music/test_api.py
+++ b/api/tests/music/test_api.py
@@ -1,13 +1,10 @@
 import json
 import os
+
 import pytest
 from django.urls import reverse
 
-from funkwhale_api.music import models
-from funkwhale_api.musicbrainz import api
-from funkwhale_api.music import serializers
-from funkwhale_api.music import tasks
-
+from funkwhale_api.music import models, tasks
 
 DATA_DIR = os.path.dirname(os.path.abspath(__file__))
 
@@ -50,7 +47,7 @@ def test_import_creates_an_import_with_correct_data(mocker, superuser_client):
     mbid = "9968a9d6-8d92-4051-8f76-674e157b6eed"
     video_id = "tPEE9ZwTmy0"
     url = reverse("api:v1:submit-single")
-    response = superuser_client.post(
+    superuser_client.post(
         url,
         {
             "import_url": "https://www.youtube.com/watch?v={0}".format(video_id),
@@ -96,9 +93,7 @@ def test_can_import_whole_album(artists, albums, mocker, superuser_client):
         ],
     }
     url = reverse("api:v1:submit-album")
-    response = superuser_client.post(
-        url, json.dumps(payload), content_type="application/json"
-    )
+    superuser_client.post(url, json.dumps(payload), content_type="application/json")
 
     batch = models.ImportBatch.objects.latest("id")
     assert batch.jobs.count() == 3
@@ -156,9 +151,7 @@ def test_can_import_whole_artist(artists, albums, mocker, superuser_client):
         ],
     }
     url = reverse("api:v1:submit-artist")
-    response = superuser_client.post(
-        url, json.dumps(payload), content_type="application/json"
-    )
+    superuser_client.post(url, json.dumps(payload), content_type="application/json")
 
     batch = models.ImportBatch.objects.latest("id")
     assert batch.jobs.count() == 3
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..2be267cffd28f9d9ab1b85fbe2b5f8e5834ed5a7 100644
--- a/api/tests/music/test_import.py
+++ b/api/tests/music/test_import.py
@@ -1,6 +1,5 @@
 import json
 import os
-import pytest
 
 from django.urls import reverse
 
@@ -36,9 +35,7 @@ def test_create_import_can_bind_to_request(
         ],
     }
     url = reverse("api:v1:submit-album")
-    response = superuser_api_client.post(
-        url, json.dumps(payload), content_type="application/json"
-    )
+    superuser_api_client.post(url, json.dumps(payload), content_type="application/json")
     batch = request.import_batches.latest("id")
 
     assert batch.import_request == request
@@ -161,7 +158,7 @@ def test_import_job_run_triggers_notifies_followers(factories, mocker, tmpfile):
     )
     batch = factories["music.ImportBatch"]()
     job = factories["music.ImportJob"](finished=True, batch=batch)
-    track = factories["music.Track"](mbid=job.mbid)
+    factories["music.Track"](mbid=job.mbid)
 
     batch.update_status()
     batch.refresh_from_db()
@@ -194,14 +191,14 @@ def test_import_batch_notifies_followers(factories, mocker):
     library_actor = actors.SYSTEM_ACTORS["library"].get_actor_instance()
 
     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"](approved=False, target=library_actor)
+    factories["federation.Follow"]()
 
     mocked_deliver = mocker.patch("funkwhale_api.federation.activity.deliver")
     batch = factories["music.ImportBatch"]()
     job1 = factories["music.ImportJob"](finished=True, batch=batch)
-    job2 = factories["music.ImportJob"](finished=True, federation=True, batch=batch)
-    job3 = factories["music.ImportJob"](status="pending", batch=batch)
+    factories["music.ImportJob"](finished=True, federation=True, batch=batch)
+    factories["music.ImportJob"](status="pending", batch=batch)
 
     batch.status = "finished"
     batch.save()
@@ -234,7 +231,7 @@ def test__do_import_in_place_mbid(factories, tmpfile):
     path = os.path.join(DATA_DIR, "test.ogg")
     job = factories["music.ImportJob"](in_place=True, source="file://{}".format(path))
 
-    track = factories["music.Track"](mbid=job.mbid)
+    factories["music.Track"](mbid=job.mbid)
     tf = tasks._do_import(job, use_acoustid=False)
 
     assert bool(tf.audio_file) is False
diff --git a/api/tests/music/test_lyrics.py b/api/tests/music/test_lyrics.py
index c15e3063732ce8b7ebab850a723eef16d26415b8..c8ce92b6a26418e9600e725b93bd1daa53ee72a4 100644
--- a/api/tests/music/test_lyrics.py
+++ b/api/tests/music/test_lyrics.py
@@ -1,14 +1,10 @@
-import json
 from django.urls import reverse
 
-from funkwhale_api.music import models
-from funkwhale_api.musicbrainz import api
-from funkwhale_api.music import serializers
-from funkwhale_api.music import tasks
 from funkwhale_api.music import lyrics as lyrics_utils
+from funkwhale_api.music import models, tasks
 
 
-def test_works_import_lyrics_if_any(lyricswiki_content, mocker, factories):
+def test_lyrics_tasks(lyricswiki_content, mocker, factories):
     mocker.patch(
         "funkwhale_api.music.lyrics._get_html", return_value=lyricswiki_content
     )
@@ -18,7 +14,7 @@ def test_works_import_lyrics_if_any(lyricswiki_content, mocker, factories):
 
     tasks.fetch_content(lyrics_id=lyrics.pk)
     lyrics.refresh_from_db()
-    self.assertIn("Grab a brush and put on a little makeup", lyrics.content)
+    assert "Grab a brush and put on a little makeup" in lyrics.content
 
 
 def test_clean_content():
@@ -36,10 +32,10 @@ def test_markdown_rendering(factories):
     content = """Hello
 Is it me you're looking for?"""
 
-    l = factories["music.Lyrics"](content=content)
+    lyrics = factories["music.Lyrics"](content=content)
 
     expected = "<p>Hello<br />\nIs it me you're looking for?</p>"
-    assert expected == l.content_rendered
+    assert expected == lyrics.content_rendered
 
 
 def test_works_import_lyrics_if_any(
diff --git a/api/tests/music/test_metadata.py b/api/tests/music/test_metadata.py
index f1e03ad12846244831951528e173c2d6158a3aa7..fbdf5b81fcbca1532c6716466a5bade62c776d0a 100644
--- a/api/tests/music/test_metadata.py
+++ b/api/tests/music/test_metadata.py
@@ -1,8 +1,9 @@
 import datetime
 import os
-import pytest
 import uuid
 
+import pytest
+
 from funkwhale_api.music import metadata
 
 DATA_DIR = os.path.dirname(os.path.abspath(__file__))
diff --git a/api/tests/music/test_models.py b/api/tests/music/test_models.py
index f81dd433fdc58f60863046aac9fe2f96581b7602..df18a09096fc147454f4fbf1905a84ff185213b2 100644
--- a/api/tests/music/test_models.py
+++ b/api/tests/music/test_models.py
@@ -1,9 +1,8 @@
 import os
+
 import pytest
 
-from funkwhale_api.music import models
-from funkwhale_api.music import importers
-from funkwhale_api.music import tasks
+from funkwhale_api.music import importers, models, tasks
 
 DATA_DIR = os.path.dirname(os.path.abspath(__file__))
 
@@ -105,7 +104,7 @@ def test_saving_job_updates_batch_status(status, factories, mocker):
 
     assert batch.status == "pending"
 
-    job = factories["music.ImportJob"](batch=batch, status=status)
+    factories["music.ImportJob"](batch=batch, status=status)
 
     batch.refresh_from_db()
 
diff --git a/api/tests/music/test_music.py b/api/tests/music/test_music.py
index 391af26cbf74eade10a163a0701184e52528a830..387cebb2c365947a0e987778b363b50ad809adb2 100644
--- a/api/tests/music/test_music.py
+++ b/api/tests/music/test_music.py
@@ -1,6 +1,8 @@
+import datetime
+
 import pytest
+
 from funkwhale_api.music import models
-import datetime
 
 
 def test_can_create_artist_from_api(artists, mocker, db):
@@ -118,7 +120,7 @@ def test_can_get_or_create_track_from_api(artists, albums, tracks, mocker, db):
 def test_album_tags_deduced_from_tracks_tags(factories, django_assert_num_queries):
     tag = factories["taggit.Tag"]()
     album = factories["music.Album"]()
-    tracks = factories["music.Track"].create_batch(5, album=album, tags=[tag])
+    factories["music.Track"].create_batch(5, album=album, tags=[tag])
 
     album = models.Album.objects.prefetch_related("tracks__tags").get(pk=album.pk)
 
@@ -130,7 +132,7 @@ def test_artist_tags_deduced_from_album_tags(factories, django_assert_num_querie
     tag = factories["taggit.Tag"]()
     album = factories["music.Album"]()
     artist = album.artist
-    tracks = factories["music.Track"].create_batch(5, album=album, tags=[tag])
+    factories["music.Track"].create_batch(5, album=album, tags=[tag])
 
     artist = models.Artist.objects.prefetch_related("albums__tracks__tags").get(
         pk=artist.pk
diff --git a/api/tests/music/test_serializers.py b/api/tests/music/test_serializers.py
index 9402e1459a603653328b5fcad961710926d63df4..51ca96b5d713af1c1e39f2c1872a9bbea9809216 100644
--- a/api/tests/music/test_serializers.py
+++ b/api/tests/music/test_serializers.py
@@ -63,7 +63,6 @@ def test_track_file_serializer(factories, to_api_date):
         "path": tf.path,
         "source": tf.source,
         "filename": tf.filename,
-        "mimetype": tf.mimetype,
         "track": tf.track.pk,
         "duration": tf.duration,
         "mimetype": tf.mimetype,
diff --git a/api/tests/music/test_tasks.py b/api/tests/music/test_tasks.py
index 1d35e75e29a7adf4c1b90199ee0c6696e90326c9..71d605b2b3768ab7b5dafa73738c0d4fb5af8c2d 100644
--- a/api/tests/music/test_tasks.py
+++ b/api/tests/music/test_tasks.py
@@ -1,7 +1,7 @@
 import os
+
 import pytest
 
-from funkwhale_api.providers.acoustid import get_acoustid_client
 from funkwhale_api.music import tasks
 
 DATA_DIR = os.path.dirname(os.path.abspath(__file__))
@@ -44,10 +44,9 @@ 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)
+    mocker.patch("acoustid.match", return_value=payload)
+    tasks.set_acoustid_on_track_file(track_file_id=track_file.pk)
     track_file.refresh_from_db()
 
     assert track_file.acoustid_track_id is None
@@ -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()
 
@@ -172,7 +170,7 @@ def test_import_job_skip_if_already_exists(artists, albums, tracks, factories, m
 def test_import_job_can_be_errored(factories, mocker, preferences):
     path = os.path.join(DATA_DIR, "test.ogg")
     mbid = "9968a9d6-8d92-4051-8f76-674e157b6eed"
-    track_file = factories["music.TrackFile"](track__mbid=mbid)
+    factories["music.TrackFile"](track__mbid=mbid)
 
     class MyException(Exception):
         pass
@@ -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)
 
@@ -229,14 +226,13 @@ def test_update_album_cover_file_data(factories, mocker):
         return_value={"hello": "world"},
     )
     tasks.update_album_cover(album=album, track_file=tf)
-    md = data = tf.get_metadata()
+    tf.get_metadata()
     mocked_get.assert_called_once_with(data={"hello": "world"})
 
 
 @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()
@@ -246,7 +242,7 @@ def test_update_album_cover_file_cover_separate_file(ext, mimetype, factories, m
     mocked_get = mocker.patch("funkwhale_api.music.models.Album.get_image")
     mocker.patch("funkwhale_api.music.metadata.Metadata.get_picture", return_value=None)
     tasks.update_album_cover(album=album, track_file=tf)
-    md = data = tf.get_metadata()
+    tf.get_metadata()
     mocked_get.assert_called_once_with(
         data={"mimetype": mimetype, "content": image_content}
     )
diff --git a/api/tests/music/test_utils.py b/api/tests/music/test_utils.py
index 276a450d4c3d466a7687075629470a5f145d9000..4019e47b4537d44b07677725bc4b0d3cb11ae7aa 100644
--- a/api/tests/music/test_utils.py
+++ b/api/tests/music/test_utils.py
@@ -1,4 +1,5 @@
 import os
+
 import pytest
 
 from funkwhale_api.music import utils
diff --git a/api/tests/music/test_views.py b/api/tests/music/test_views.py
index 139a33cf5dbd70dd206db56805a45b3a484fccf6..aa04521cb571583ba8ce26511c12fe6bb5f2b518 100644
--- a/api/tests/music/test_views.py
+++ b/api/tests/music/test_views.py
@@ -1,12 +1,11 @@
 import io
-import pytest
 
+import pytest
 from django.urls import reverse
 from django.utils import timezone
 
-from funkwhale_api.music import serializers
-from funkwhale_api.music import views
 from funkwhale_api.federation import actors
+from funkwhale_api.music import serializers, views
 
 
 @pytest.mark.parametrize(
@@ -106,7 +105,7 @@ def test_can_serve_track_file_as_remote_library(
 ):
     preferences["common__api_authentication_required"] = True
     library_actor = actors.SYSTEM_ACTORS["library"].get_actor_instance()
-    follow = factories["federation.Follow"](
+    factories["federation.Follow"](
         approved=True, actor=authenticated_actor, target=library_actor
     )
 
@@ -246,8 +245,8 @@ def test_can_list_import_jobs(factories, superuser_api_client):
 
 
 def test_import_job_stats(factories, superuser_api_client):
-    job1 = factories["music.ImportJob"](status="pending")
-    job2 = factories["music.ImportJob"](status="errored")
+    factories["music.ImportJob"](status="pending")
+    factories["music.ImportJob"](status="errored")
 
     url = reverse("api:v1:import-jobs-stats")
     response = superuser_api_client.get(url)
@@ -258,7 +257,7 @@ def test_import_job_stats(factories, superuser_api_client):
 
 def test_import_job_stats_filter(factories, superuser_api_client):
     job1 = factories["music.ImportJob"](status="pending")
-    job2 = factories["music.ImportJob"](status="errored")
+    factories["music.ImportJob"](status="errored")
 
     url = reverse("api:v1:import-jobs-stats")
     response = superuser_api_client.get(url, {"batch": job1.batch.pk})
@@ -334,7 +333,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 +346,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..96b537ca297a5b9e8c81528349b42d5404fbe9f6 100644
--- a/api/tests/music/test_works.py
+++ b/api/tests/music/test_works.py
@@ -1,9 +1,4 @@
-import json
-from django.urls import reverse
-
 from funkwhale_api.music import models
-from funkwhale_api.musicbrainz import api
-from funkwhale_api.music import serializers
 
 
 def test_can_import_work(factories, mocker, works):
@@ -40,7 +35,7 @@ def test_can_get_work_from_recording(factories, mocker, works, tracks):
     )
     mbid = "e2ecabc4-1b9d-30b2-8f30-3596ec423dc5"
 
-    assert recording.work == None
+    assert recording.work is None
 
     work = recording.get_work()
 
diff --git a/api/tests/musicbrainz/test_api.py b/api/tests/musicbrainz/test_api.py
index de84813f1f147b91a7198624df85f9742f88db58..0fdaf7ab6cadf4ee67ed4d7c9783fa69f58f4e89 100644
--- a/api/tests/musicbrainz/test_api.py
+++ b/api/tests/musicbrainz/test_api.py
@@ -1,8 +1,5 @@
-import json
 from django.urls import reverse
 
-from funkwhale_api.musicbrainz import api
-
 
 def test_can_search_recording_in_musicbrainz_api(
     recordings, db, mocker, logged_in_api_client
diff --git a/api/tests/playlists/test_models.py b/api/tests/playlists/test_models.py
index 3258e6d10dc7dd0f7800d322259f33215654a4ea..25c40d5573ea9c67e4a3926ddfd7024032c8ab78 100644
--- a/api/tests/playlists/test_models.py
+++ b/api/tests/playlists/test_models.py
@@ -1,5 +1,4 @@
 import pytest
-
 from rest_framework import exceptions
 
 
@@ -107,7 +106,7 @@ def test_remove_update_indexes(factories):
 
 def test_can_insert_many(factories):
     playlist = factories["playlists.Playlist"]()
-    existing = factories["playlists.PlaylistTrack"](playlist=playlist, index=0)
+    factories["playlists.PlaylistTrack"](playlist=playlist, index=0)
     tracks = factories["music.Track"].create_batch(size=3)
     plts = playlist.insert_many(tracks)
     for i, plt in enumerate(plts):
@@ -119,7 +118,7 @@ def test_can_insert_many(factories):
 def test_insert_many_honor_max_tracks(preferences, factories):
     preferences["playlists__max_tracks"] = 4
     playlist = factories["playlists.Playlist"]()
-    plts = factories["playlists.PlaylistTrack"].create_batch(size=2, playlist=playlist)
+    factories["playlists.PlaylistTrack"].create_batch(size=2, playlist=playlist)
     track = factories["music.Track"]()
     with pytest.raises(exceptions.ValidationError):
         playlist.insert_many([track, track, track])
diff --git a/api/tests/playlists/test_serializers.py b/api/tests/playlists/test_serializers.py
index 05e5bd7cab4e46e828598515f91d349c32b83757..677288070082872453325d2bf7ad8a8fd5072cca 100644
--- a/api/tests/playlists/test_serializers.py
+++ b/api/tests/playlists/test_serializers.py
@@ -1,11 +1,10 @@
-from funkwhale_api.playlists import models
-from funkwhale_api.playlists import serializers
+from funkwhale_api.playlists import models, serializers
 
 
 def test_cannot_max_500_tracks_per_playlist(factories, preferences):
     preferences["playlists__max_tracks"] = 2
     playlist = factories["playlists.Playlist"]()
-    plts = factories["playlists.PlaylistTrack"].create_batch(size=2, playlist=playlist)
+    factories["playlists.PlaylistTrack"].create_batch(size=2, playlist=playlist)
     track = factories["music.Track"]()
     serializer = serializers.PlaylistTrackWriteSerializer(
         data={"playlist": playlist.pk, "track": track.pk}
@@ -53,7 +52,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..e7b47c7a2d924032e55d324b4bdc05d2e8f8341d 100644
--- a/api/tests/playlists/test_views.py
+++ b/api/tests/playlists/test_views.py
@@ -1,19 +1,14 @@
-import json
 import pytest
-
 from django.urls import reverse
-from django.core.exceptions import ValidationError
-from django.utils import timezone
 
-from funkwhale_api.playlists import models
-from funkwhale_api.playlists import serializers
+from funkwhale_api.playlists import models, serializers
 
 
 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"
@@ -22,7 +17,7 @@ def test_can_create_playlist_via_api(logged_in_api_client):
 
 def test_serializer_includes_tracks_count(factories, logged_in_api_client):
     playlist = factories["playlists.Playlist"]()
-    plt = factories["playlists.PlaylistTrack"](playlist=playlist)
+    factories["playlists.PlaylistTrack"](playlist=playlist)
 
     url = reverse("api:v1:playlists-detail", kwargs={"pk": playlist.pk})
     response = logged_in_api_client.get(url)
@@ -38,7 +33,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 +75,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
     )
@@ -165,7 +160,7 @@ def test_can_add_multiple_tracks_at_once_via_api(
 
 def test_can_clear_playlist_from_api(factories, mocker, logged_in_api_client):
     playlist = factories["playlists.Playlist"](user=logged_in_api_client.user)
-    plts = factories["playlists.PlaylistTrack"].create_batch(size=5, playlist=playlist)
+    factories["playlists.PlaylistTrack"].create_batch(size=5, playlist=playlist)
     url = reverse("api:v1:playlists-clear", kwargs={"pk": playlist.pk})
     response = logged_in_api_client.delete(url)
 
@@ -175,7 +170,7 @@ def test_can_clear_playlist_from_api(factories, mocker, logged_in_api_client):
 
 def test_update_playlist_from_api(factories, mocker, logged_in_api_client):
     playlist = factories["playlists.Playlist"](user=logged_in_api_client.user)
-    plts = factories["playlists.PlaylistTrack"].create_batch(size=5, playlist=playlist)
+    factories["playlists.PlaylistTrack"].create_batch(size=5, playlist=playlist)
     url = reverse("api:v1:playlists-detail", kwargs={"pk": playlist.pk})
     response = logged_in_api_client.patch(url, {"name": "test"})
     playlist.refresh_from_db()
diff --git a/api/tests/radios/test_api.py b/api/tests/radios/test_api.py
index 4a72d81ba02b69b436bdbbda44f83e454a955f25..5f542c88061333a9b6d2a39005e7a35cc1676273 100644
--- a/api/tests/radios/test_api.py
+++ b/api/tests/radios/test_api.py
@@ -1,11 +1,9 @@
 import json
-import pytest
 
 from django.urls import reverse
 
 from funkwhale_api.music.serializers import TrackSerializer
-from funkwhale_api.radios import filters
-from funkwhale_api.radios import serializers
+from funkwhale_api.radios import filters, serializers
 
 
 def test_can_list_config_options(logged_in_client):
diff --git a/api/tests/radios/test_filters.py b/api/tests/radios/test_filters.py
index 025fc7a636ba074763b644dfa55b33e9880402ad..89bb726aff643c7365b759b510f763b738c738d0 100644
--- a/api/tests/radios/test_filters.py
+++ b/api/tests/radios/test_filters.py
@@ -1,5 +1,4 @@
 import pytest
-
 from django.core.exceptions import ValidationError
 
 from funkwhale_api.music.models import Track
@@ -15,7 +14,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..e218ced907de421873bcc22e80a16b4fbf7e228e 100644
--- a/api/tests/radios/test_radios.py
+++ b/api/tests/radios/test_radios.py
@@ -1,15 +1,12 @@
 import json
 import random
-import pytest
 
-from django.urls import reverse
+import pytest
 from django.core.exceptions import ValidationError
+from django.urls import reverse
 
-
-from funkwhale_api.radios import radios
-from funkwhale_api.radios import models
-from funkwhale_api.radios import serializers
 from funkwhale_api.favorites.models import TrackFavorite
+from funkwhale_api.radios import models, radios, serializers
 
 
 def test_can_pick_track_from_choices():
@@ -74,8 +71,7 @@ def test_can_get_choices_for_custom_radio(factories):
     artist = factories["music.Artist"]()
     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]
+    factories["music.TrackFile"].create_batch(5)
 
     session = factories["radios.CustomRadioSession"](
         custom_radio__config=[{"type": "artist", "ids": [artist.pk]}]
@@ -114,14 +110,13 @@ 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]
+    factories["music.TrackFile"].create_batch(30)
     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 = [
@@ -141,7 +136,7 @@ def test_can_restore_radio_from_previous_session(factories):
 
 def test_can_start_radio_for_logged_in_user(logged_in_client):
     url = reverse("api:v1:radios:sessions-list")
-    response = logged_in_client.post(url, {"radio_type": "random"})
+    logged_in_client.post(url, {"radio_type": "random"})
     session = models.RadioSession.objects.latest("id")
     assert session.radio_type == "random"
     assert session.user == logged_in_client.user
@@ -185,8 +180,7 @@ def test_related_object_radio_validate_related_object(factories):
 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]
+    factories["music.TrackFile"].create_batch(5)
     good_files = factories["music.TrackFile"].create_batch(5, track__artist=artist)
     good_tracks = [f.track for f in good_files]
 
@@ -200,8 +194,7 @@ def test_can_start_artist_radio(factories):
 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]
+    factories["music.TrackFile"].create_batch(5)
     good_files = factories["music.TrackFile"].create_batch(5, track__tags=[tag])
     good_tracks = [f.track for f in good_files]
 
@@ -236,7 +229,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/requests/test_models.py b/api/tests/requests/test_models.py
index d6b71635afd1eb5517c854304f88ab18b95abcda..3ac8a534207acc5152b18ed0eedc8c429463f345 100644
--- a/api/tests/requests/test_models.py
+++ b/api/tests/requests/test_models.py
@@ -1,8 +1,3 @@
-import pytest
-
-from django.forms import ValidationError
-
-
 def test_can_bind_import_batch_to_request(factories):
     request = factories["requests.ImportRequest"]()
 
diff --git a/api/tests/subsonic/test_authentication.py b/api/tests/subsonic/test_authentication.py
index f404c8b0ab3ac9c1d5e6c35e7cd80886df304e0b..b2d2c04001d694bacff2e4e2f816240944e4d2fa 100644
--- a/api/tests/subsonic/test_authentication.py
+++ b/api/tests/subsonic/test_authentication.py
@@ -1,6 +1,6 @@
 import binascii
-import pytest
 
+import pytest
 from rest_framework import exceptions
 
 from funkwhale_api.subsonic import authentication
@@ -21,11 +21,9 @@ def test_auth_with_salt(api_request, factories):
 
 
 def test_auth_with_password_hex(api_request, factories):
-    salt = "salt"
     user = factories["users.User"]()
     user.subsonic_api_token = "password"
     user.save()
-    token = authentication.get_token(salt, "password")
     request = api_request.get(
         "/",
         {
@@ -45,11 +43,9 @@ def test_auth_with_password_hex(api_request, factories):
 
 
 def test_auth_with_password_cleartext(api_request, factories):
-    salt = "salt"
     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()
@@ -59,11 +55,9 @@ def test_auth_with_password_cleartext(api_request, factories):
 
 
 def test_auth_with_inactive_users(api_request, factories):
-    salt = "salt"
     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_renderers.py b/api/tests/subsonic/test_renderers.py
index 65dae6f2292eda00cbc8c498763515214e7c08de..301fee8b5d2e67673d7cc829fcdeb399fb1b0b76 100644
--- a/api/tests/subsonic/test_renderers.py
+++ b/api/tests/subsonic/test_renderers.py
@@ -24,7 +24,7 @@ def test_xml_renderer_dict_to_xml():
 
 def test_xml_renderer():
     payload = {"hello": "world"}
-    expected = b'<?xml version="1.0" encoding="UTF-8"?>\n<subsonic-response hello="world" status="ok" version="1.16.0" xmlns="http://subsonic.org/restapi" />'
+    expected = b'<?xml version="1.0" encoding="UTF-8"?>\n<subsonic-response hello="world" status="ok" version="1.16.0" xmlns="http://subsonic.org/restapi" />'  # noqa
 
     renderer = renderers.SubsonicXMLRenderer()
     rendered = renderer.render(payload)
diff --git a/api/tests/subsonic/test_views.py b/api/tests/subsonic/test_views.py
index d06bf5525d6cd7c72cc85788cbe109de46e6e2e3..1523a2f6270746a909bc670a354f027e9060eed0 100644
--- a/api/tests/subsonic/test_views.py
+++ b/api/tests/subsonic/test_views.py
@@ -1,16 +1,13 @@
 import datetime
 import json
-import pytest
 
-from django.utils import timezone
+import pytest
 from django.urls import reverse
-
-from rest_framework.response import Response
+from django.utils import timezone
 
 from funkwhale_api.music import models as music_models
 from funkwhale_api.music import views as music_views
-from funkwhale_api.subsonic import renderers
-from funkwhale_api.subsonic import serializers
+from funkwhale_api.subsonic import renderers, serializers
 
 
 def render_json(data):
@@ -80,7 +77,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 +94,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 +121,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,9 +163,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"](
-        track=track, user=logged_in_api_client.user
-    )
+    factories["favorites.TrackFavorite"](track=track, user=logged_in_api_client.user)
     response = logged_in_api_client.get(url, {"f": f, "id": track.pk})
 
     assert response.status_code == 200
@@ -283,7 +278,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 +345,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 +379,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..67f6c489d9304c13d1721a529ebc870eb35dca98 100644
--- a/api/tests/test_import_audio_file.py
+++ b/api/tests/test_import_audio_file.py
@@ -1,13 +1,11 @@
-import pytest
 import datetime
 import os
-import uuid
 
+import pytest
 from django.core.management import call_command
 from django.core.management.base import CommandError
 
 from funkwhale_api.providers.audiofile import tasks
-from funkwhale_api.music import tasks as music_tasks
 
 DATA_DIR = os.path.join(os.path.dirname(os.path.abspath(__file__)), "files")
 
@@ -20,8 +18,8 @@ def test_can_create_track_from_file_metadata_no_mbid(db, mocker):
         "TRACKNUMBER": ["4"],
         "date": ["2012-08-15"],
     }
-    m1 = mocker.patch("mutagen.File", return_value=metadata)
-    m2 = mocker.patch(
+    mocker.patch("mutagen.File", return_value=metadata)
+    mocker.patch(
         "funkwhale_api.music.metadata.Metadata.get_file_type", return_value="OggVorbis"
     )
     track = tasks.import_track_data_from_path(os.path.join(DATA_DIR, "dummy_file.ogg"))
@@ -70,8 +68,8 @@ def test_can_create_track_from_file_metadata_mbid(factories, mocker):
         "musicbrainz_albumid": [album.mbid],
         "musicbrainz_trackid": [track_data["recording"]["id"]],
     }
-    m1 = mocker.patch("mutagen.File", return_value=metadata)
-    m2 = mocker.patch(
+    mocker.patch("mutagen.File", return_value=metadata)
+    mocker.patch(
         "funkwhale_api.music.metadata.Metadata.get_file_type", return_value="OggVorbis"
     )
     track = tasks.import_track_data_from_path(os.path.join(DATA_DIR, "dummy_file.ogg"))
@@ -85,7 +83,7 @@ def test_can_create_track_from_file_metadata_mbid(factories, mocker):
 
 def test_management_command_requires_a_valid_username(factories, mocker):
     path = os.path.join(DATA_DIR, "dummy_file.ogg")
-    user = factories["users.User"](username="me")
+    factories["users.User"](username="me")
     mocker.patch(
         "funkwhale_api.providers.audiofile.management.commands.import_files.Command.do_import",  # noqa
         return_value=(mocker.MagicMock(), []),
@@ -96,7 +94,7 @@ def test_management_command_requires_a_valid_username(factories, mocker):
 
 
 def test_in_place_import_only_from_music_dir(factories, settings):
-    user = factories["users.User"](username="me")
+    factories["users.User"](username="me")
     settings.MUSIC_DIRECTORY_PATH = "/nope"
     path = os.path.join(DATA_DIR, "dummy_file.ogg")
     with pytest.raises(CommandError):
@@ -128,7 +126,7 @@ def test_import_files_creates_a_batch_and_job(factories, mocker):
 def test_import_files_skip_if_path_already_imported(factories, mocker):
     user = factories["users.User"](username="me")
     path = os.path.join(DATA_DIR, "dummy_file.ogg")
-    existing = factories["music.TrackFile"](source="file://{}".format(path))
+    factories["music.TrackFile"](source="file://{}".format(path))
 
     call_command("import_files", path, username="me", async=False, interactive=False)
     assert user.imports.count() == 0
diff --git a/api/tests/test_youtube.py b/api/tests/test_youtube.py
index 629558cc3235f60340c4a9f567e3d36c62fc1d3b..cb5559ce1c2a24fc16e5bdbc326fa3e6c717110d 100644
--- a/api/tests/test_youtube.py
+++ b/api/tests/test_youtube.py
@@ -1,6 +1,7 @@
-import json
 from collections import OrderedDict
+
 from django.urls import reverse
+
 from funkwhale_api.providers.youtube.client import client
 
 from .data import youtube as api_data
@@ -32,7 +33,7 @@ def test_can_get_search_results_from_funkwhale(preferences, mocker, api_client,
         "id": "0HxZn6CzOIo",
         "url": "https://www.youtube.com/watch?v=0HxZn6CzOIo",
         "type": "youtube#video",
-        "description": "Make sure to apply adhesive evenly before use. GET IT HERE: http://adhesivewombat.bandcamp.com/album/marsupial-madness Facebook: ...",
+        "description": "Description",
         "channelId": "UCps63j3krzAG4OyXeEyuhFw",
         "title": "AdhesiveWombat - 8 Bit Adventure",
         "channelTitle": "AdhesiveWombat",
@@ -81,7 +82,7 @@ def test_can_send_multiple_queries_at_once_from_funwkhale(
         "id": "0HxZn6CzOIo",
         "url": "https://www.youtube.com/watch?v=0HxZn6CzOIo",
         "type": "youtube#video",
-        "description": "Make sure to apply adhesive evenly before use. GET IT HERE: http://adhesivewombat.bandcamp.com/album/marsupial-madness Facebook: ...",
+        "description": "Description",
         "channelId": "UCps63j3krzAG4OyXeEyuhFw",
         "title": "AdhesiveWombat - 8 Bit Adventure",
         "channelTitle": "AdhesiveWombat",
diff --git a/api/tests/users/test_jwt.py b/api/tests/users/test_jwt.py
index 28ff09d7467dec9b451564abd14218db8dbbb96e..83de757c8b1d49570f680f2673aebefb3e0803e5 100644
--- a/api/tests/users/test_jwt.py
+++ b/api/tests/users/test_jwt.py
@@ -1,11 +1,7 @@
 import pytest
-import uuid
-
 from jwt.exceptions import DecodeError
 from rest_framework_jwt.settings import api_settings
 
-from funkwhale_api.users.models import User
-
 
 def test_can_invalidate_token_when_changing_user_secret_key(factories):
     user = factories["users.User"]()
diff --git a/api/tests/users/test_permissions.py b/api/tests/users/test_permissions.py
index f4b5010180d96471b30a3b550484702aed0277c1..7f72138f4a14394e3a65d53deda3ab1728f32473 100644
--- a/api/tests/users/test_permissions.py
+++ b/api/tests/users/test_permissions.py
@@ -87,8 +87,6 @@ def test_has_user_permission_logged_in_multiple_or(
     request = api_request.get("/")
     setattr(request, "user", user)
     result = permission.has_permission(request, view)
-    assert (
-        result
-        == user.has_permissions("federation", "library", operator="or")
-        == expected
-    )
+    has_permission_result = user.has_permissions("federation", "library", operator="or")
+
+    assert result == has_permission_result == expected
diff --git a/api/tests/users/test_views.py b/api/tests/users/test_views.py
index f7a11367e15968ae8edeb0b10340cd9407661438..00272c2aea76026c3df2b125c39fdee852acf1ec 100644
--- a/api/tests/users/test_views.py
+++ b/api/tests/users/test_views.py
@@ -1,7 +1,4 @@
-import json
 import pytest
-
-from django.test import RequestFactory
 from django.urls import reverse
 
 from funkwhale_api.users.models import User
@@ -114,7 +111,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()
 
@@ -164,7 +161,7 @@ def test_user_can_request_new_subsonic_token(logged_in_api_client):
     assert response.data == {"subsonic_api_token": user.subsonic_api_token}
 
 
-def test_user_can_get_new_subsonic_token(logged_in_api_client):
+def test_user_can_get_subsonic_token(logged_in_api_client):
     user = logged_in_api_client.user
     user.subsonic_api_token = "test"
     user.save()
@@ -179,24 +176,6 @@ def test_user_can_get_new_subsonic_token(logged_in_api_client):
     assert response.data == {"subsonic_api_token": "test"}
 
 
-def test_user_can_request_new_subsonic_token(logged_in_api_client):
-    user = logged_in_api_client.user
-    user.subsonic_api_token = "test"
-    user.save()
-
-    url = reverse(
-        "api:v1:users:users-subsonic-token", kwargs={"username": user.username}
-    )
-
-    response = logged_in_api_client.post(url)
-
-    assert response.status_code == 200
-    user.refresh_from_db()
-    assert user.subsonic_api_token != "test"
-    assert user.subsonic_api_token is not None
-    assert response.data == {"subsonic_api_token": user.subsonic_api_token}
-
-
 def test_user_can_delete_subsonic_token(logged_in_api_client):
     user = logged_in_api_client.user
     user.subsonic_api_token = "test"
diff --git a/changes/changelog.d/297.misc b/changes/changelog.d/297.misc
new file mode 100644
index 0000000000000000000000000000000000000000..ac47458fdcdac7aebdab2d3ec366078538545694
--- /dev/null
+++ b/changes/changelog.d/297.misc
@@ -0,0 +1,2 @@
+Added Black and flake8 checks in CI to ensure consistent code styling and
+formatting (#297)