from typing import Dict, Tuple, Union
from music_assistant.constants import EventType
-from music_assistant.controllers.stream import StreamController
from music_assistant.helpers.typing import MusicAssistant
from music_assistant.models.errors import AlreadyRegisteredError
from music_assistant.models.player import Player, PlayerGroup
class PlayerController:
"""Controller holding all logic to play music from MusicProviders to supported players."""
- def __init__(self, mass: MusicAssistant, stream_port: int) -> None:
+ def __init__(self, mass: MusicAssistant) -> None:
"""Initialize class."""
self.mass = mass
self.logger = mass.logger.getChild("players")
self._players: Dict[str, PlayerType] = {}
self._player_queues: Dict[str, PlayerQueue] = {}
- self.streams = StreamController(mass, stream_port)
async def setup(self) -> None:
"""Async initialize of module."""
volume_normalization_enabled BOOLEAN,
volume_normalization_target INTEGER)"""
)
- await self.streams.setup()
@property
def players(self) -> Tuple[PlayerType]:
from music_assistant.controllers.metadata import MetaDataController
from music_assistant.controllers.music import MusicController
from music_assistant.controllers.players import PlayerController
+from music_assistant.controllers.stream import StreamController
from music_assistant.helpers.cache import Cache
from music_assistant.helpers.database import Database
self.cache = Cache(self)
self.metadata = MetaDataController(self)
self.music = MusicController(self)
- self.players = PlayerController(self, stream_port)
+ self.players = PlayerController(self)
+ self.streams = StreamController(self, stream_port)
self._tracked_tasks: List[asyncio.Task] = []
self.closed = False
await self.music.setup()
await self.metadata.setup()
await self.players.setup()
+ await self.streams.setup()
self.create_task(self.__process_jobs())
async def stop(self) -> None:
self._update_task: Task = None
self._signal_next: bool = False
self._last_player_update: int = 0
- self._stream_url: str = self.mass.players.streams.get_stream_url(self.queue_id)
+ self._stream_url: str = self.mass.streams.get_stream_url(self.queue_id)
async def setup(self) -> None:
"""Handle async setup of instance."""
async def play_index(self, index: Union[int, str]) -> None:
"""Play item at index (or item_id) X in queue."""
if self.player.use_multi_stream:
- await self.mass.players.streams.stop_multi_client_queue_stream(
- self.queue_id
- )
+ await self.mass.streams.stop_multi_client_queue_stream(self.queue_id)
if not isinstance(index, int):
index = self.index_by_id(index)
if index is None:
self._current_index = index
self._next_start_index = index
# send stream url to player connected to this queue
- self._stream_url = self.mass.players.streams.get_stream_url(self.queue_id)
+ self._stream_url = self.mass.streams.get_stream_url(self.queue_id)
if self.player.use_multi_stream:
# multi stream enabled, all child players should receive the same audio stream
for child_id in self.player.group_childs:
if child_player := self.mass.players.get_player(child_id):
if child_player.powered:
- player_url = self.mass.players.streams.get_stream_url(
+ player_url = self.mass.streams.get_stream_url(
self.queue_id, child_id
)
expected_clients.add(child_id)
tasks.append(child_player.play_url(player_url))
tasks.append(child_player.pause())
- await self.mass.players.streams.start_multi_client_queue_stream(
+ await self.mass.streams.start_multi_client_queue_stream(
self.queue_id, expected_clients, ContentType.FLAC
)
await asyncio.gather(*tasks)