import aiohttp
from asyncio_throttle import Throttler
-
from music_assistant.helpers.typing import MusicAssistant
-
# TODO: add support for personal api keys ?
# TODO: Add support for album artwork ?
import aiohttp
from asyncio_throttle import Throttler
-
from music_assistant.helpers.cache import cached
from music_assistant.helpers.compare import compare_strings, get_compare_string
from music_assistant.helpers.typing import MusicAssistant
from music_assistant.controllers.music.tracks import TracksController
from music_assistant.helpers.cache import cached
from music_assistant.helpers.datetime import utc_timestamp
+from music_assistant.helpers.typing import MusicAssistant
+from music_assistant.helpers.util import create_task
from music_assistant.models.errors import (
AlreadyRegisteredError,
MusicAssistantError,
SetupFailedError,
)
-from music_assistant.helpers.typing import MusicAssistant
-from music_assistant.helpers.util import create_task
from music_assistant.models.media_items import (
Album,
MediaItem,
"""Manage MediaItems of type Playlist."""
from __future__ import annotations
-import time
+import time
from typing import List
from music_assistant.constants import EventType
from music_assistant.helpers.cache import cached
-from music_assistant.models.errors import InvalidDataError, MediaNotFoundError
-from music_assistant.helpers.util import create_sort_name, merge_dict, merge_list
from music_assistant.helpers.json import json_serializer
+from music_assistant.helpers.util import create_sort_name, merge_dict, merge_list
+from music_assistant.models.errors import InvalidDataError, MediaNotFoundError
from music_assistant.models.media_controller import MediaControllerBase
from music_assistant.models.media_items import MediaType, Playlist, Track
from __future__ import annotations
from music_assistant.constants import EventType
-from music_assistant.helpers.util import create_sort_name, merge_dict, merge_list
from music_assistant.helpers.json import json_serializer
+from music_assistant.helpers.util import create_sort_name, merge_dict, merge_list
from music_assistant.models.media_controller import MediaControllerBase
from music_assistant.models.media_items import MediaType, Radio
compare_strings,
compare_track,
)
-from music_assistant.helpers.util import create_sort_name, merge_dict, merge_list
from music_assistant.helpers.json import json_serializer
+from music_assistant.helpers.util import create_sort_name, merge_dict, merge_list
from music_assistant.models.media_controller import MediaControllerBase
-from music_assistant.models.media_items import (
- ItemMapping,
- MediaType,
- Track,
-)
+from music_assistant.models.media_items import ItemMapping, MediaType, Track
class TracksController(MediaControllerBase[Track]):
from music_assistant.constants import EventType
from music_assistant.controllers.stream import StreamController
-from music_assistant.models.errors import AlreadyRegisteredError
from music_assistant.helpers.typing import MusicAssistant
+from music_assistant.models.errors import AlreadyRegisteredError
from music_assistant.models.player import Player, PlayerGroup
from music_assistant.models.player_queue import PlayerQueue
import asyncio
from asyncio import Task
from dataclasses import dataclass
-
-from typing import AsyncGenerator, Awaitable, Callable, Dict, List
from time import time
+from typing import AsyncGenerator, Awaitable, Callable, Dict, List
from uuid import uuid4
-from aiohttp import web
+from aiohttp import web
from music_assistant.constants import EventType
from music_assistant.helpers.audio import (
check_audio_support,
from typing import AsyncGenerator, List, Optional, Tuple
import aiofiles
-
from music_assistant.constants import EventType
from music_assistant.helpers.process import AsyncProcess, check_output
from music_assistant.helpers.typing import MusicAssistant, QueueItem
"""Database logic."""
from __future__ import annotations
+
from contextlib import asynccontextmanager
from typing import Any, Dict, List, Mapping
from databases import Database as Db
from databases import DatabaseURL
-
from music_assistant.helpers.typing import MusicAssistant
# pylint: disable=invalid-name
from io import BytesIO
from music_assistant.helpers.typing import MusicAssistant
-from music_assistant.models.media_items import ItemMapping, MediaType, MediaItemType
+from music_assistant.models.media_items import ItemMapping, MediaItemType, MediaType
from PIL import Image
"""Typing helper."""
-from typing import TYPE_CHECKING, Any, Optional, List
-
+from typing import TYPE_CHECKING, Any, List, Optional
# pylint: disable=invalid-name
if TYPE_CHECKING:
import aiohttp
from databases import DatabaseURL
-
from music_assistant.constants import EventType
from music_assistant.controllers.metadata import MetaDataController
from music_assistant.controllers.music import MusicController
from typing import Any, Dict, List, Mapping
from mashumaro import DataClassDictMixin
-
-
from music_assistant.helpers.json import json
-
from music_assistant.helpers.util import create_sort_name
from typing import TYPE_CHECKING, Any, Dict, List
from mashumaro import DataClassDictMixin
-
from music_assistant.constants import EventType
from music_assistant.helpers.typing import MusicAssistant
from music_assistant.helpers.util import create_task
from uuid import uuid4
from mashumaro import DataClassDictMixin
-
from music_assistant.constants import EventType
from music_assistant.helpers.audio import get_stream_details
from music_assistant.helpers.typing import MusicAssistant
"""Filesystem musicprovider support for MusicAssistant."""
from __future__ import annotations
+
import base64
import os
from typing import List, Optional, Tuple
+
import aiofiles
-from tinytag import TinyTag
+from music_assistant.helpers.compare import compare_strings, get_compare_string
from music_assistant.helpers.util import parse_title_and_version, try_parse_int
-from music_assistant.helpers.compare import get_compare_string, compare_strings
from music_assistant.models.media_items import (
Album,
AlbumType,
Track,
)
from music_assistant.models.provider import MusicProvider
+from tinytag import TinyTag
def split_items(org_str: str) -> Tuple[str]:
from typing import List, Optional
from asyncio_throttle import Throttler
-
from music_assistant.constants import EventType
from music_assistant.helpers.app_vars import ( # pylint: disable=no-name-in-module
get_app_var,
)
-from music_assistant.models.errors import LoginFailed
from music_assistant.helpers.util import parse_title_and_version, try_parse_int
+from music_assistant.models.errors import LoginFailed
from music_assistant.models.media_items import (
Album,
AlbumType,
from typing import List, Optional
from asyncio_throttle import Throttler
-
from music_assistant.helpers.app_vars import ( # noqa # pylint: disable=no-name-in-module
get_app_var,
)
-from music_assistant.models.errors import LoginFailed
from music_assistant.helpers.util import parse_title_and_version
+from music_assistant.models.errors import LoginFailed
from music_assistant.models.media_items import (
Album,
AlbumType,
from typing import List, Optional
from asyncio_throttle import Throttler
-
from music_assistant.models.media_items import (
ContentType,
MediaItemProviderId,