from music_assistant_models.config_entries import ConfigValueType, ProviderConfig
from music_assistant_models.provider import ProviderManifest
- from music_assistant import MusicAssistant
+ from music_assistant.mass import MusicAssistant
from music_assistant.models import ProviderInstanceType
from music_assistant_models.config_entries import ProviderConfig
from music_assistant_models.provider import ProviderManifest
- from music_assistant import MusicAssistant
+ from music_assistant.mass import MusicAssistant
from music_assistant.models import ProviderInstanceType
CONF_MISSING_ALBUM_ARTIST_ACTION = "missing_album_artist_action"
return os.path.dirname(self.relative_path)
@classmethod
- def from_dir_entry(cls, entry: os.DirEntry, base_path: str) -> FileSystemItem:
+ def from_dir_entry(cls, entry: os.DirEntry[str], base_path: str) -> FileSystemItem:
"""Create FileSystemItem from os.DirEntry. NOT Async friendly."""
if entry.is_dir(follow_symlinks=False):
return cls(
from music_assistant_models.config_entries import ProviderConfig
from music_assistant_models.provider import ProviderManifest
- from music_assistant import MusicAssistant
+ from music_assistant.mass import MusicAssistant
from music_assistant.models import ProviderInstanceType
CONF_HOST = "host"
from music_assistant_models.config_entries import ProviderConfig
from music_assistant_models.provider import ProviderManifest
- from music_assistant import MusicAssistant
+ from music_assistant.mass import MusicAssistant
from music_assistant.models import ProviderInstanceType
AUDIOMANAGER_STREAM_MUSIC = 3
from typing import TYPE_CHECKING
from aiojellyfin import MediaLibrary as JellyMediaLibrary
-from aiojellyfin import NotFound, SessionConfiguration, authenticate_by_name
+from aiojellyfin import NotFound, authenticate_by_name
from aiojellyfin import Track as JellyTrack
+from aiojellyfin.session import SessionConfiguration
from music_assistant_models.config_entries import ConfigEntry, ConfigValueType, ProviderConfig
from music_assistant_models.enums import (
ConfigEntryType,
)
from music_assistant_models.streamdetails import StreamDetails
-from music_assistant import MusicAssistant
from music_assistant.constants import UNKNOWN_ARTIST_ID_MBID
+from music_assistant.mass import MusicAssistant
from music_assistant.models import ProviderInstanceType
from music_assistant.models.music_provider import MusicProvider
from music_assistant.providers.jellyfin.parsers import (
from plexapi.media import Media as PlexMedia
from plexapi.media import MediaPart as PlexMediaPart
- from music_assistant import MusicAssistant
+ from music_assistant.mass import MusicAssistant
from music_assistant.models import ProviderInstanceType
CONF_ACTION_AUTH_MYPLEX = "auth_myplex"
from plexapi.server import PlexServer
if TYPE_CHECKING:
- from music_assistant import MusicAssistant
+ from music_assistant.mass import MusicAssistant
async def get_libraries(
from music_assistant_models.config_entries import ConfigValueType, ProviderConfig
from music_assistant_models.provider import ProviderManifest
- from music_assistant import MusicAssistant
+ from music_assistant.mass import MusicAssistant
from music_assistant.models import ProviderInstanceType
CONF_STORED_RADIOS = "stored_radios"
)
from music_assistant_models.streamdetails import StreamDetails
-from music_assistant.constants import (
- MASS_LOGO,
- SILENCE_FILE_LONG,
- VARIOUS_ARTISTS_FANART,
-)
+from music_assistant.constants import MASS_LOGO, SILENCE_FILE_LONG, VARIOUS_ARTISTS_FANART
from music_assistant.models.music_provider import MusicProvider
if TYPE_CHECKING:
from music_assistant_models.config_entries import ConfigValueType, ProviderConfig
from music_assistant_models.provider import ProviderManifest
- from music_assistant import MusicAssistant
+ from music_assistant.mass import MusicAssistant
from music_assistant.models import ProviderInstanceType
from music_assistant_models.config_entries import ConfigValueType, ProviderConfig
from music_assistant_models.provider import ProviderManifest
- from music_assistant import MusicAssistant
+ from music_assistant.mass import MusicAssistant
from music_assistant.models import ProviderInstanceType
SUPPORTED_FEATURES = {
from tidalapi.media import Lyrics as TidalLyrics
from tidalapi.media import Stream as TidalStream
- from music_assistant import MusicAssistant
+ from music_assistant.mass import MusicAssistant
from music_assistant.models import ProviderInstanceType
TOKEN_TYPE = "Bearer"
+++ /dev/null
-[mypy]
-python_version = 3.12
-platform = linux
-show_error_codes = true
-follow_imports = silent
-local_partial_types = true
-strict_equality = true
-no_implicit_optional = true
-warn_incomplete_stub = true
-warn_redundant_casts = true
-warn_unused_configs = true
-warn_unused_ignores = true
-enable_error_code = ignore-without-code, redundant-self, truthy-iterable
-disable_error_code = annotation-unchecked, import-not-found, import-untyped
-extra_checks = false
-check_untyped_defs = true
-disallow_incomplete_defs = true
-disallow_subclassing_any = true
-disallow_untyped_calls = true
-disallow_untyped_decorators = true
-disallow_untyped_defs = true
-warn_return_any = true
-warn_unreachable = true
-packages=tests,music_assistant.providers.builtin,music_assistant.providers.filesystem_local,music_assistant.providers.filesystem_smb,music_assistant.providers.fully_kiosk,music_assistant.providers.jellyfin,music_assistant.providers.plex,music_assistant.providers.radiobrowser,music_assistant.providers.test,music_assistant.providers.theaudiodb,music_assistant.providers.tidal
[tool.mypy]
platform = "linux"
-python_version = "3.11"
+python_version = "3.12"
-# show error messages from unrelated files
-follow_imports = "normal"
+# set this to normal when we have fixed all exclusions
+follow_imports = "silent"
# suppress errors about unsatisfied imports
ignore_missing_imports = true
warn_return_any = true
warn_unused_configs = true
warn_unused_ignores = true
+show_error_codes = true
+local_partial_types = true
+strict_equality = true
+enable_error_code = [
+ "ignore-without-code",
+ "redundant-self",
+ "truthy-iterable",
+]
+disable_error_code = [
+ "annotation-unchecked",
+ "import-not-found",
+ "import-untyped"
+]
+extra_checks = false
+warn_unreachable = true
+packages = [
+ "tests",
+ "music_assistant",
+]
+exclude = [
+ '^music_assistant/controllers/.*$',
+ '^music_assistant/helpers/.*$',
+ '^music_assistant/models/.*$',
+ '^music_assistant/mass\.py$',
+ '^music_assistant/__main__\.py$',
+ '^music_assistant/providers/_template_music_provider/.*$',
+ '^music_assistant/providers/_template_player_provider/.*$',
+ '^music_assistant/providers/airplay/.*$',
+ '^music_assistant/providers/apple_music/.*$',
+ '^music_assistant/providers/bluesound/.*$',
+ '^music_assistant/providers/chromecast/.*$',
+ '^music_assistant/providers/deezer/.*$',
+ '^music_assistant/providers/dlna/.*$',
+ '^music_assistant/providers/fanarttv/.*$',
+ '^music_assistant/providers/hass/.*$',
+ '^music_assistant/providers/hass_players/.*$',
+ '^music_assistant/providers/ibroadcast/.*$',
+ '^music_assistant/providers/musicbrainz/.*$',
+ '^music_assistant/providers/opensubsonic/.*$',
+ '^music_assistant/providers/player_group/.*$',
+ '^music_assistant/providers/podcastfeed/.*$',
+ '^music_assistant/providers/qobuz/.*$',
+ '^music_assistant/providers/siriusxm/.*$',
+ '^music_assistant/providers/slimproto/.*$',
+ '^music_assistant/providers/sonos/.*$',
+ '^music_assistant/providers/sonos_s1/.*$',
+ '^music_assistant/providers/soundcloud/.*$',
+ '^music_assistant/providers/snapcast/.*$',
+ '^music_assistant/providers/spotify/.*$',
+ '^music_assistant/providers/tunein/.*$',
+ '^music_assistant/providers/ytmusic/.*$',
+]
[tool.ruff.format]
# Force Linux/MacOS line endings
from music_assistant_models.enums import EventType
from music_assistant_models.event import MassEvent
-from music_assistant import MusicAssistant
+from music_assistant.mass import MusicAssistant
def _get_fixture_folder(provider: str | None = None) -> pathlib.Path:
import pytest
-from music_assistant import MusicAssistant
+from music_assistant.mass import MusicAssistant
@pytest.fixture(name="caplog")
from music_assistant_models.enums import EventType
from music_assistant_models.event import MassEvent
-from music_assistant import MusicAssistant
+from music_assistant.mass import MusicAssistant
async def test_start_and_stop_server(mass: MusicAssistant) -> None:
import pathlib
+from music_assistant.constants import UNKNOWN_ARTIST
from music_assistant.helpers import tags
RESOURCES_DIR = pathlib.Path(__file__).parent.parent.resolve().joinpath("fixtures")
assert _tags.title == "test"
assert _tags.duration == 1.032
assert _tags.album_artists == ()
- assert _tags.artists == (tags.UNKNOWN_ARTIST,)
+ assert _tags.artists == (UNKNOWN_ARTIST,)
assert _tags.genres == ()
assert _tags.musicbrainz_albumartistids == ()
assert _tags.musicbrainz_artistids == ()
from aiojellyfin.testing import FixtureBuilder
from music_assistant_models.config_entries import ProviderConfig
-from music_assistant import MusicAssistant
+from music_assistant.mass import MusicAssistant
from tests.common import get_fixtures_dir, wait_for_sync_completion
import aiofiles
import aiohttp
import pytest
-from aiojellyfin import Artist, Connection, SessionConfiguration
+from aiojellyfin import Artist, Connection
+from aiojellyfin.session import SessionConfiguration
from mashumaro.codecs.json import JSONDecoder
from syrupy.assertion import SnapshotAssertion