Maintenance: Replace pylint with ruff (#1675)
authorMarcel van der Veldt <m.vanderveldt@outlook.com>
Thu, 19 Sep 2024 07:28:00 +0000 (09:28 +0200)
committerGitHub <noreply@github.com>
Thu, 19 Sep 2024 07:28:00 +0000 (09:28 +0200)
30 files changed:
.pre-commit-config.yaml
Dockerfile
music_assistant/__main__.py
music_assistant/common/helpers/util.py
music_assistant/common/models/api.py
music_assistant/common/models/event.py
music_assistant/server/controllers/cache.py
music_assistant/server/controllers/config.py
music_assistant/server/controllers/players.py
music_assistant/server/controllers/streams.py
music_assistant/server/controllers/webserver.py
music_assistant/server/helpers/api.py
music_assistant/server/helpers/app_vars.py
music_assistant/server/helpers/audio.py
music_assistant/server/helpers/images.py
music_assistant/server/helpers/logging.py
music_assistant/server/helpers/process.py
music_assistant/server/helpers/webserver.py
music_assistant/server/models/player_provider.py
music_assistant/server/providers/apple_music/__init__.py
music_assistant/server/providers/chromecast/helpers.py
music_assistant/server/providers/deezer/__init__.py
music_assistant/server/providers/fanarttv/__init__.py
music_assistant/server/providers/filesystem_local/__init__.py
music_assistant/server/providers/jellyfin/__init__.py
music_assistant/server/providers/qobuz/__init__.py
music_assistant/server/providers/sonos_s1/helpers.py
music_assistant/server/providers/spotify/__init__.py
music_assistant/server/server.py
pyproject.toml

index 27d3ba93264a4ab3c708602e1073639cae08e517..09bbbe9106bb70794befde90672c1ef4736d5bce 100644 (file)
@@ -80,17 +80,12 @@ repos:
         always_run: true
         args:
           - --branch=main
-      # - id: pylint
-      #   name: ðŸŒŸ Starring code with pylint
-      #   language: system
-      #   types: [python]
-      #   entry: scripts/run-in-env.sh pylint
-      # - id: trailing-whitespace
-      #   name: âœ„  Trim Trailing Whitespace
-      #   language: system
-      #   types: [text]
-      #   entry: scripts/run-in-env.sh trailing-whitespace-fixer
-      #   stages: [commit, push, manual]
+      - id: trailing-whitespace
+        name: âœ„  Trim Trailing Whitespace
+        language: system
+        types: [text]
+        entry: scripts/run-in-env.sh trailing-whitespace-fixer
+        stages: [commit, push, manual]
       - id: mypy
         name: mypy
         entry: scripts/run-in-env.sh mypy
index ccaa246b31b1145cb3a446e1d52364373d4befe5..3f942aa8e8428b607fead6022fe1bf8008269622 100644 (file)
@@ -16,7 +16,7 @@ RUN uv pip install \
     --no-cache \
     --find-links "https://wheels.home-assistant.io/musllinux/" \
     "music-assistant[server]@dist/music_assistant-${MASS_VERSION}-py3-none-any.whl"
-    
+
 # Set some labels
 LABEL \
     org.opencontainers.image.title="Music Assistant Server" \
@@ -32,7 +32,7 @@ LABEL \
     io.hass.platform="${TARGETPLATFORM}" \
     io.hass.type="addon"
 
-RUN rm -rf dist    
+RUN rm -rf dist
 
 VOLUME [ "/data" ]
 EXPOSE 8095
index 4e0e4ad1945cf6a3a533b003f1187ac7a22df340..1a10de76044aec14dd1add50266e219406c2dff2 100644 (file)
@@ -134,7 +134,6 @@ def setup_logger(data_path: str, level: str = "DEBUG"):
 
 def _enable_posix_spawn() -> None:
     """Enable posix_spawn on Alpine Linux."""
-    # pylint: disable=protected-access
     if subprocess._USE_POSIX_SPAWN:
         return
 
index 14285902418f4d0d21b8d291e560fe0e8030330b..7c14e89e9d06515e156e2561dc936242c6a1296f 100644 (file)
@@ -12,10 +12,8 @@ from typing import Any, TypeVar
 from urllib.parse import urlparse
 from uuid import UUID
 
-# pylint: disable=invalid-name
 T = TypeVar("T")
 CALLBACK_TYPE = Callable[[], None]
-# pylint: enable=invalid-name
 
 keyword_pattern = re.compile("title=|artist=")
 title_pattern = re.compile(r"title=\"(?P<title>.*?)\"")
@@ -207,7 +205,6 @@ async def get_ip() -> str:
 
     def _get_ip() -> str:
         """Get primary IP-address for this host."""
-        # pylint: disable=broad-except,no-member
         sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
         try:
             # doesn't even have to be reachable
@@ -251,7 +248,7 @@ async def get_ip_from_host(dns_name: str) -> str | None:
     def _resolve() -> str | None:
         try:
             return socket.gethostbyname(dns_name)
-        except Exception:  # pylint: disable=broad-except
+        except Exception:
             # fail gracefully!
             return None
 
@@ -262,7 +259,6 @@ async def get_ip_pton(ip_string: str | None = None) -> bytes:
     """Return socket pton for local ip."""
     if ip_string is None:
         ip_string = await get_ip()
-    # pylint:disable=no-member
     try:
         return await asyncio.to_thread(socket.inet_pton, socket.AF_INET, ip_string)
     except OSError:
@@ -272,12 +268,10 @@ async def get_ip_pton(ip_string: str | None = None) -> bytes:
 def get_folder_size(folderpath: str) -> float:
     """Return folder size in gb."""
     total_size = 0
-    # pylint: disable=unused-variable
     for dirpath, _dirnames, filenames in os.walk(folderpath):
         for _file in filenames:
             _fp = os.path.join(dirpath, _file)
             total_size += os.path.getsize(_fp)
-    # pylint: enable=unused-variable
     return total_size / float(1 << 30)
 
 
index d3b5e83c942b3f9b3536b8509c6bded00365c497..ec43ea02f2b2d8ab3647d1e333e1a2e043b379b0 100644 (file)
@@ -10,8 +10,6 @@ from mashumaro.mixins.orjson import DataClassORJSONMixin
 from music_assistant.common.helpers.json import get_serializable_value
 from music_assistant.common.models.event import MassEvent
 
-# pylint: disable=unnecessary-lambda
-
 
 @dataclass
 class CommandMessage(DataClassORJSONMixin):
index 74b40dc7d8a0f092ae336335f265d7fa2d0e0cb0..a997808f1b96776de9c4777da1f38e1bf995970f 100644 (file)
@@ -17,7 +17,5 @@ class MassEvent(DataClassORJSONMixin):
     object_id: str | None = None  # player_id, queue_id or uri
     data: Any = field(
         default=None,
-        metadata={
-            "serialize": lambda v: get_serializable_value(v)  # pylint: disable=unnecessary-lambda
-        },
+        metadata={"serialize": lambda v: get_serializable_value(v)},
     )
index 7196879170fa08bd373a32b089e7242a0d754ecf..441c3c6e57daff31267df3d9a63b165916c19d8a 100644 (file)
@@ -111,7 +111,7 @@ class CacheController(CoreController):
         ) and (not checksum or db_row["checksum"] == checksum and db_row["expires"] >= cur_time):
             try:
                 data = await asyncio.to_thread(json_loads, db_row["data"])
-            except Exception as exc:  # pylint: disable=broad-except
+            except Exception as exc:
                 LOGGER.error(
                     "Error parsing cache data for %s: %s",
                     memory_key,
index 72602e5e403442785db7f77eead21b6f2d4ba9c4..0aa98c59df108e74f074e4e65580a6ec0daf3215 100644 (file)
@@ -665,7 +665,7 @@ class ConfigController:
                     return
             except FileNotFoundError:
                 pass
-            except JSON_DECODE_EXCEPTIONS:  # pylint: disable=catching-non-exception
+            except JSON_DECODE_EXCEPTIONS:
                 LOGGER.exception("Error while reading persistent storage file %s", filename)
         LOGGER.debug("Started with empty storage: No persistent storage file found.")
 
index e3231a0cc3b733a37397adac2f58e1fbe1fa7e00..247296ab2af08c97238261cab2cdcdba06e94886 100644 (file)
@@ -1125,7 +1125,7 @@ class PlayerController(CoreController):
                         player.available = False
                         player.state = PlayerState.IDLE
                         player.powered = False
-                    except Exception as err:  # pylint: disable=broad-except
+                    except Exception as err:
                         self.logger.warning(
                             "Error while requesting latest state from player %s: %s",
                             player.display_name,
index 88731633a8b825c2769d1febe214f69f00099d41..ccdd23247af3781e315cc830b0ea448babc597f1 100644 (file)
@@ -98,8 +98,6 @@ FLOW_DEFAULT_SAMPLE_RATE = 48000
 FLOW_DEFAULT_BIT_DEPTH = 24
 
 
-# pylint:disable=too-many-locals
-
 isfile = wrap(os.path.isfile)
 
 
index c3faff21ea935a713323997a9f6a1193c67e440b..f117f779c859bf9b8f735f61d53fc1e3e5f64f7d 100644 (file)
@@ -298,7 +298,7 @@ class WebsocketClientHandler:
         except asyncio.CancelledError:
             self._logger.debug("Connection closed by client")
 
-        except Exception:  # pylint: disable=broad-except
+        except Exception:
             self._logger.exception("Unexpected error inside websocket API")
 
         finally:
@@ -361,7 +361,7 @@ class WebsocketClientHandler:
             elif asyncio.iscoroutine(result):
                 result = await result
             self._send_message(SuccessResultMessage(msg.message_id, result))
-        except Exception as err:  # pylint: disable=broad-except
+        except Exception as err:
             if self._logger.isEnabledFor(logging.DEBUG):
                 self._logger.exception("Error handling message: %s", msg)
             else:
index c5b782e73146945d4c381a4ab9d9b4eba5813041..ddc7f0cd42072955231603c08067015ddbf6b20c 100644 (file)
@@ -137,7 +137,7 @@ def parse_value(name: str, value: Any, value_type: Any, default: Any = MISSING)
         logging.getLogger(__name__).warning(err)
         return None
     if origin is type:
-        return eval(value)  # pylint: disable=eval-used
+        return eval(value)
     if value_type is Any:
         return value
     if value is None and value_type is not NoneType:
index 65ec57705b85b1eeb39b8c790a3429d47583021e..913a334ecfe61cb38df1ebc6fc5dce5d583714b3 100644 (file)
@@ -1,4 +1,3 @@
-# pylint: skip-file
 # fmt: off
 # flake8: noqa
 # ruff: noqa
index 6c975b1fc7abead88b0fe3a7a5221cb4b6ed4930..9bfe1623a4427c51f1201ffbf37cbd75ae0b4b58 100644 (file)
@@ -53,7 +53,7 @@ if TYPE_CHECKING:
     from music_assistant.server import MusicAssistant
 
 LOGGER = logging.getLogger(f"{MASS_LOGGER_NAME}.audio")
-# pylint:disable=consider-using-f-string,too-many-locals,too-many-statements
+
 # ruff: noqa: PLR0915
 
 HTTP_HEADERS = {"User-Agent": "Lavf/60.16.100.MusicAssistant"}
@@ -425,7 +425,6 @@ async def get_media_stream(
 
 def create_wave_header(samplerate=44100, channels=2, bitspersample=16, duration=None):
     """Generate a wave header from given params."""
-    # pylint: disable=no-member
     file = BytesIO()
 
     # Generate format chunk
index 37bb36742dbbb93c053b3578cfc1fc31ef185eed..29f6648b9e1c717e9b175729aa05d20c212d8953 100644 (file)
@@ -78,7 +78,7 @@ async def get_image_thumb(
         except UnidentifiedImageError:
             raise FileNotFoundError(f"Invalid image: {path_or_url}")
         if size:
-            img.thumbnail((size, size), Image.LANCZOS)  # pylint: disable=no-member
+            img.thumbnail((size, size), Image.LANCZOS)
 
         mode = "RGBA" if image_format == "PNG" else "RGB"
         img.convert(mode).save(data, image_format, optimize=True)
index f48484e0a8838f2dbc6e11a0ad468f68154bb3c8..1dac5a3addecd449a8f90fd61d5e2b7afb364bee 100644 (file)
@@ -140,7 +140,7 @@ def catch_log_exception(
             """Catch and log exception."""
             try:
                 await async_func(*args)
-            except Exception:  # pylint: disable=broad-except
+            except Exception:
                 log_exception(format_err, *args)
 
         wrapper_func = async_wrapper
@@ -152,7 +152,7 @@ def catch_log_exception(
             """Catch and log exception."""
             try:
                 func(*args)
-            except Exception:  # pylint: disable=broad-except
+            except Exception:
                 log_exception(format_err, *args)
 
         wrapper_func = wrapper
@@ -168,7 +168,7 @@ def catch_log_coro_exception(
         """Catch and log exception."""
         try:
             return await target
-        except Exception:  # pylint: disable=broad-except
+        except Exception:
             log_exception(format_err, *args)
             return None
 
index 36e1f0abfbb8f74097efe28c02ccf66ff2fbb16e..21d0ef03dd073d6a37aa76c264513a306de6ed99 100644 (file)
@@ -25,8 +25,6 @@ LOGGER = logging.getLogger(f"{MASS_LOGGER_NAME}.helpers.process")
 
 DEFAULT_CHUNKSIZE = 64000
 
-# pylint: disable=invalid-name
-
 
 class AsyncProcess:
     """
index 96d193d1875c02a758a5c80ee58688e1a1f048c3..249df4fe2579c3d4878f56ef8623b99db0e60313 100644 (file)
@@ -105,7 +105,7 @@ class Webserver:
             msg = "Dynamic routes are not enabled"
             raise RuntimeError(msg)
         key = f"{method}.{path}"
-        if key in self._dynamic_routes:  # pylint: disable=unsupported-membership-test
+        if key in self._dynamic_routes:
             msg = f"Route {path} already registered."
             raise RuntimeError(msg)
         self._dynamic_routes[key] = handler
index 534673ebcdac6ab5a296f5441242f6b7c69036bc..2b553d7a6172884d25fee1b2c4a48578fc77e757 100644 (file)
@@ -269,7 +269,6 @@ class PlayerProvider(Provider):
     @property
     def players(self) -> list[Player]:
         """Return all players belonging to this provider."""
-        # pylint: disable=no-member
         return [
             player
             for player in self.mass.players
index cc81904838f2efa82682177c4055bbe86d61a670..79863152c024aa896c5cd093c60a3021e33e5920 100644 (file)
@@ -38,8 +38,6 @@ from music_assistant.common.models.media_items import (
 )
 from music_assistant.common.models.streamdetails import StreamDetails
 from music_assistant.constants import CONF_PASSWORD
-
-# pylint: disable=no-name-in-module
 from music_assistant.server.helpers.app_vars import app_var
 from music_assistant.server.helpers.audio import get_hls_substream
 from music_assistant.server.helpers.throttle_retry import ThrottlerManager, throttle_with_retries
index 62d691ad6390d7d11cf4974d53f704f1df7f7a08..cf6afc46bedc25c625dbb5c321f9ac9480aaa8e8 100644 (file)
@@ -228,7 +228,6 @@ class CastStatusListener:
 
         All following callbacks won't be forwarded.
         """
-        # pylint: disable=protected-access
         if self.castplayer.cast_info.is_audio_group:
             self._mz_mgr.remove_multizone(self._uuid)
         else:
index 10294087d77b9f87f00c2df0c54331f7ebdf6a31..6be1f0ce35731f646ae37563d482cc579df2bd83 100644 (file)
@@ -44,11 +44,7 @@ from music_assistant.common.models.media_items import (
 )
 from music_assistant.common.models.provider import ProviderManifest
 from music_assistant.common.models.streamdetails import StreamDetails
-
-# pylint: disable=no-name-in-module
 from music_assistant.server.helpers.app_vars import app_var
-
-# pylint: enable=no-name-in-module
 from music_assistant.server.helpers.auth import AuthenticationHelper
 from music_assistant.server.models import ProviderInstanceType
 from music_assistant.server.models.music_provider import MusicProvider
@@ -128,7 +124,7 @@ async def setup(
 
 async def get_config_entries(
     mass: MusicAssistant,
-    instance_id: str | None = None,  # noqa: ARG001 pylint: disable=W0613
+    instance_id: str | None = None,  # noqa: ARG001
     action: str | None = None,
     values: dict[str, ConfigValueType] | None = None,
 ) -> tuple[ConfigEntry, ...]:
@@ -166,7 +162,7 @@ async def get_config_entries(
     )
 
 
-class DeezerProvider(MusicProvider):  # pylint: disable=W0223
+class DeezerProvider(MusicProvider):
     """Deezer provider support."""
 
     client: deezer.Client
index d3bac5750c16e9eb9d04e7137a54a02eb1eb21db..cdb72c60be7344247e5dce0af5d7c70edf86b199 100644 (file)
@@ -11,7 +11,7 @@ from music_assistant.common.models.config_entries import ConfigEntry
 from music_assistant.common.models.enums import ConfigEntryType, ExternalID, ProviderFeature
 from music_assistant.common.models.media_items import ImageType, MediaItemImage, MediaItemMetadata
 from music_assistant.server.controllers.cache import use_cache
-from music_assistant.server.helpers.app_vars import app_var  # pylint: disable=no-name-in-module
+from music_assistant.server.helpers.app_vars import app_var
 from music_assistant.server.helpers.throttle_retry import Throttler
 from music_assistant.server.models.metadata_provider import MetadataProvider
 
index b6116da5bdc20c461bb2d7c985b6a2095d2237ef..12c4d28d7ecfb2478e3476dcd0f5c06e83287dd3 100644 (file)
@@ -340,7 +340,7 @@ class LocalFileSystemProvider(MusicProvider):
                     playlist,
                     overwrite_existing=prev_checksum is not None,
                 )
-        except Exception as err:  # pylint: disable=broad-except
+        except Exception as err:
             # we don't want the whole sync to crash on one file so we catch all exceptions here
             self.logger.error(
                 "Error processing %s - %s",
@@ -553,7 +553,7 @@ class LocalFileSystemProvider(MusicProvider):
                     track.position = idx
                     result.append(track)
 
-        except Exception as err:  # pylint: disable=broad-except
+        except Exception as err:
             self.logger.warning(
                 "Error while parsing playlist %s: %s",
                 prov_playlist_id,
index b0d9c9c6e3ec899f03aaeff1c8f1766d74ebd895..b8abc700f318b96b9eb8711363fb8970256dcdad 100644 (file)
@@ -81,7 +81,7 @@ async def setup(
 
 async def get_config_entries(
     mass: MusicAssistant,
-    instance_id: str | None = None,  # pylint: disable=W0613
+    instance_id: str | None = None,
     action: str | None = None,
     values: dict[str, ConfigValueType] | None = None,
 ) -> tuple[ConfigEntry, ...]:
index 59f0746e12468de9d8151c574887a34d5f09578e..33ebeb4fbc062a5d8365182965ccec308bd59be2 100644 (file)
@@ -47,11 +47,7 @@ from music_assistant.constants import (
     VARIOUS_ARTISTS_MBID,
     VARIOUS_ARTISTS_NAME,
 )
-
-# pylint: disable=no-name-in-module
 from music_assistant.server.helpers.app_vars import app_var
-
-# pylint: enable=no-name-in-module
 from music_assistant.server.helpers.throttle_retry import ThrottlerManager, throttle_with_retries
 from music_assistant.server.helpers.util import lock
 from music_assistant.server.models.music_provider import MusicProvider
@@ -585,7 +581,6 @@ class QobuzProvider(MusicProvider):
 
     async def _parse_track(self, track_obj: dict) -> Track:
         """Parse qobuz track object to generic layout."""
-        # pylint: disable=too-many-branches
         name, version = parse_title_and_version(track_obj["title"], track_obj.get("version"))
         track = Track(
             item_id=str(track_obj["id"]),
@@ -743,7 +738,6 @@ class QobuzProvider(MusicProvider):
     @throttle_with_retries
     async def _get_data(self, endpoint, sign_request=False, **kwargs):
         """Get data from api."""
-        # pylint: disable=too-many-branches
         self.logger.debug("Handling GET request to %s", endpoint)
         url = f"http://www.qobuz.com/api.json/0.2/{endpoint}"
         headers = {"X-App-Id": app_var(0)}
index 4f458be303d94bac97727a6330ff494069ae484d..662cf6c40ee94cdce9a93cacf89544237545b1f0 100644 (file)
@@ -86,7 +86,7 @@ def _find_target_identifier(instance: Any, fallback_soco: SoCo | None) -> str |
     if soco := getattr(instance, "soco", fallback_soco):
         # Holds a SoCo instance attribute
         # Only use attributes with no I/O
-        return soco._player_name or soco.ip_address  # pylint: disable=protected-access
+        return soco._player_name or soco.ip_address
     return None
 
 
index 616a0442253fc2a0d48384b24654375c299e5459..4f3b3326ab642354089e1ef3f75c73b0420130bc 100644 (file)
@@ -41,12 +41,8 @@ from music_assistant.common.models.media_items import (
     Track,
 )
 from music_assistant.common.models.streamdetails import StreamDetails
-
-# pylint: disable=no-name-in-module
 from music_assistant.constants import VERBOSE_LOG_LEVEL
 from music_assistant.server.helpers.app_vars import app_var
-
-# pylint: enable=no-name-in-module
 from music_assistant.server.helpers.audio import get_chunksize
 from music_assistant.server.helpers.auth import AuthenticationHelper
 from music_assistant.server.helpers.process import AsyncProcess, check_output
index a906e426daff3ae7e2c8dc8ee6e0a5c998aa8426..aa119d3f33756b97eb2f4510b2855ea0876cfbfe 100644 (file)
@@ -456,7 +456,6 @@ class MusicAssistant:
 
         try:
             await self.load_provider_config(prov_conf)
-        # pylint: disable=broad-except
         except Exception as exc:
             # if loading failed, we store the error in the config object
             # so we can show something useful to the user
@@ -653,7 +652,7 @@ class MusicAssistant:
                             provider_manifest.icon_svg_dark = await get_icon_string(icon_path)
                     self._provider_manifests[provider_manifest.domain] = provider_manifest
                     LOGGER.debug("Loaded manifest for provider %s", provider_manifest.name)
-                except Exception as exc:  # pylint: disable=broad-except
+                except Exception as exc:
                     LOGGER.exception(
                         "Error while loading manifest for provider %s",
                         provider_domain,
@@ -709,7 +708,7 @@ class MusicAssistant:
 
     def _on_mdns_service_state_change(
         self,
-        zeroconf: Zeroconf,  # pylint: disable=unused-argument
+        zeroconf: Zeroconf,
         service_type: str,
         name: str,
         state_change: ServiceStateChange,
index a4a913b3e8cb005c036cc038ca9eee834dfff05b..46347ed71f35dd530055d1ea0be34575ad0531c0 100644 (file)
@@ -47,7 +47,6 @@ test = [
   "mypy==1.11.2",
   "pre-commit==3.8.0",
   "pre-commit-hooks==4.6.0",
-  "pylint==3.2.7",
   "pytest==8.3.3",
   "pytest-aiohttp==1.0.5",
   "pytest-cov==5.0.0",
@@ -122,61 +121,6 @@ warn_unused_ignores = true
 # Force Linux/MacOS line endings
 line-ending = "lf"
 
-[tool.pylint.MASTER]
-extension-pkg-whitelist = ["orjson"]
-ignore = ["tests"]
-
-[tool.pylint.BASIC]
-good-names = ["_", "id", "on", "Run", "T"]
-
-[tool.pylint.DESIGN]
-max-attributes = 8
-
-[tool.pylint."MESSAGES CONTROL"]
-disable = [
-  "duplicate-code",
-  "format",
-  "unsubscriptable-object",
-  "unused-argument", # handled by ruff
-  "unspecified-encoding", # handled by ruff
-  "isinstance-second-argument-not-valid-type", # conflict with ruff
-  "fixme", # we're still developing  # TEMPORARY DISABLED rules  # The below rules must be enabled later one-by-one !
-  "too-many-return-statements",
-  "unsupported-assignment-operation",
-  "invalid-name",
-  "redefined-outer-name",
-  "too-many-statements",
-  "deprecated-method",
-  "logging-fstring-interpolation",
-  "attribute-defined-outside-init",
-  "broad-exception-caught",
-  "expression-not-assigned",
-  "consider-using-f-string",
-  "consider-using-with",
-  "arguments-renamed",
-  "protected-access",
-  "too-many-boolean-expressions",
-  "raise-missing-from",
-  "too-many-locals",
-  "abstract-method",
-  "unnecessary-lambda",
-  "stop-iteration-return",
-  "no-else-return",
-  "no-else-raise",
-  "undefined-loop-variable",
-  "too-many-nested-blocks",
-  "too-many-public-methods", # unavoidable?
-  "too-many-arguments", # unavoidable?
-  "too-many-branches", # unavoidable?
-  "too-many-instance-attributes", # unavoidable?
-]
-
-[tool.pylint.SIMILARITIES]
-ignore-imports = true
-
-[tool.pylint.FORMAT]
-max-line-length = 100
-
 [tool.pytest.ini_options]
 addopts = "--cov music_assistant"
 asyncio_mode = "auto"