self._poll_task: asyncio.Task | None = None
self._player_throttlers: dict[str, Throttler] = {}
self._announce_locks: dict[str, asyncio.Lock] = {}
- # TEMP 2024-11-20: register some aliases for renamed commands
- # remove after a few releases
- self.mass.register_api_command("players/cmd/sync", self.cmd_group)
- self.mass.register_api_command("players/cmd/unsync", self.cmd_ungroup)
- self.mass.register_api_command("players/cmd/sync_many", self.cmd_group_many)
- self.mass.register_api_command("players/cmd/unsync_many", self.cmd_ungroup_many)
async def setup(self, config: CoreConfig) -> None:
"""Async initialize of module."""
import asyncio
import os
-import shutil
import urllib.parse
from collections.abc import AsyncGenerator
from dataclasses import dataclass, field
SILENCE_FILE,
VERBOSE_LOG_LEVEL,
)
+from music_assistant.helpers.audio import CACHE_FILES_IN_USE
+from music_assistant.helpers.audio import LOGGER as AUDIO_LOGGER
from music_assistant.helpers.audio import (
- CACHE_FILES_IN_USE,
crossfade_pcm_parts,
get_chunksize,
get_media_stream,
get_silence,
get_stream_details,
)
-from music_assistant.helpers.audio import LOGGER as AUDIO_LOGGER
from music_assistant.helpers.ffmpeg import LOGGER as FFMPEG_LOGGER
from music_assistant.helpers.ffmpeg import check_ffmpeg_version, get_ffmpeg_stream
from music_assistant.helpers.util import (
)
self.manifest.icon = "cast-audio"
self.announcements: dict[str, str] = {}
- # TEMP: remove old cache dir
- # remove after 2.5.0b15 or b16
- prev_cache_dir = os.path.join(self.mass.cache_path, ".audio")
- if os.path.isdir(prev_cache_dir):
- shutil.rmtree(prev_cache_dir)
# prefer /tmp/.audio as audio cache dir
self._audio_cache_dir = os.path.join("/tmp/.audio") # noqa: S108
self.allow_cache_default = "auto"
# run async setup
await provider.handle_async_init()
- # TEMP workaround
- # cleanup wrong name config value (set to provider name)
- # remove after 2.4 release
- if conf.name == prov_manifest.name:
- self.config.set_raw_provider_config_value(provider.instance_id, "name", None)
- provider.config.name = None
-
# if we reach this point, the provider loaded successfully
self._providers[provider.instance_id] = provider
LOGGER.info(
async def loaded_in_mass(self) -> None:
"""Call after the provider has been loaded."""
await super().loaded_in_mass()
- # temp: migrate old config entries
- # remove this after MA 2.4 release
- for player_config in await self.mass.config.get_player_configs(include_values=True):
- # migrate provider set to domain to instance_id
- if player_config.provider == self.manifest.domain:
- self.mass.config.set_raw_player_config_value(
- player_config.player_id, "provider", self.instance_id
- )
- player_config.provider = self.instance_id
- # migrate old syncgroup/UGP players to this provider
- if player_config.values.get(CONF_GROUP_TYPE) is not None:
- # already migrated
- continue
- if player_config.player_id.startswith(SYNCGROUP_PREFIX):
- self.mass.config.set_raw_player_config_value(
- player_config.player_id, CONF_GROUP_TYPE, player_config.provider
- )
- player_config.provider = self.instance_id
- self.mass.config.set_raw_player_config_value(
- player_config.player_id, "provider", self.instance_id
- )
- elif player_config.player_id.startswith(UNIVERSAL_PREFIX):
- self.mass.config.set_raw_player_config_value(
- player_config.player_id, CONF_GROUP_TYPE, "universal"
- )
- player_config.provider = self.instance_id
- self.mass.config.set_raw_player_config_value(
- player_config.player_id, "provider", self.instance_id
- )
-
+ # register all existing group players
await self._register_all_players()
# listen for player added events so we can catch late joiners
# (because a group depends on its childs to be available)