"""
player = self.get_player(player_id, True)
player_queue = self.get_active_player_queue(player_id, True)
- if player_queue.queue_id != player_id and not player.calculated_state.powered:
- # only force player on if its not the actual queue player
+ # power on player if needed
+ if not player.calculated_state.powered:
await self.cmd_power_on(player_id)
# a single item or list of items may be provided
if not isinstance(items, list):
raise FileNotFoundError("Invalid uri: %s" % uri)
player = self.get_player(player_id, True)
player_queue = self.get_active_player_queue(player_id, True)
- if player_queue.queue_id != player_id and not player.calculated_state.powered:
- # only force player on if its not the actual queue player
+ # power on player if needed
+ if not player.calculated_state.powered:
await self.cmd_power_on(player_id)
# load item into the queue
queue_item = player_queue.create_queue_item(
player.calculated_state.name,
)
return
- if player_queue.queue_id != player_id and not player.calculated_state.powered:
- # only force player on if its not the actual queue player
+ # power on player if needed
+ if not player.calculated_state.powered:
await self.cmd_power_on(player_id)
# snapshot the (active) queue
prev_queue_items = player_queue.items
"""
player = self.get_player(player_id, True)
player_queue = self.get_active_player_queue(player_id)
- if player_queue.queue_id != player_id and not player.calculated_state.powered:
- # only force player on if its not the actual queue player
+ # power on player if needed
+ if not player.calculated_state.powered:
await self.cmd_power_on(player_id)
# unpause if paused else resume queue
if player_queue.state == PlayerState.PAUSED:
"""
player_queue = self.get_active_player_queue(player_id, True)
if player_queue.state == PlayerState.PLAYING:
- await player_queue.pause()
+ await self.cmd_pause(player_queue.queue_id)
else:
- await player_queue.play()
+ await self.cmd_play(player_queue.queue_id)
@api_route("players/{player_id}/cmd/next", method="PUT")
async def cmd_next(self, player_id: str) -> None:
:param player_id: player_id of the player to handle the command.
"""
player_queue = self.get_active_player_queue(player_id, True)
- await player_queue.next()
+ if player_queue.state == PlayerState.PLAYING:
+ await player_queue.next()
+ else:
+ await self.cmd_play(player_queue.queue_id)
@api_route("players/{player_id}/cmd/previous", method="PUT")
async def cmd_previous(self, player_id: str):
:param player_id: player_id of the player to handle the command.
"""
player_queue = self.get_active_player_queue(player_id, True)
- await player_queue.previous()
+ if player_queue.state == PlayerState.PLAYING:
+ await player_queue.previous()
+ else:
+ await self.cmd_play(player_queue.queue_id)
@api_route("players/{player_id}/cmd/power_on", method="PUT")
async def cmd_power_on(self, player_id: str) -> None:
queue_item = QueueItem(
item_id=uri, provider="mass", name="Music Assistant", stream_url=uri
)
- return await self.cmd_queue_load([queue_item, queue_item])
- await self.chromecast_command(self._chromecast.play_media, uri, "audio/flac")
+ await self.cmd_queue_load([queue_item, queue_item])
+ else:
+ await self.chromecast_command(
+ self._chromecast.play_media, uri, "audio/flac"
+ )
async def cmd_queue_load(self, queue_items: List[QueueItem]) -> None:
"""Load (overwrite) queue with new items."""
await self.launch_app()
await self.chromecast_command(self.__send_player_queue, queuedata)
if len(queue_items) > 25:
+ await asyncio.sleep(5)
await self.cmd_queue_append(queue_items[26:])
async def cmd_queue_append(self, queue_items: List[QueueItem]) -> None:
"insertBefore": None,
"items": chunk,
}
- await self.launch_app()
await self.chromecast_command(self.__send_player_queue, queuedata)
+ await asyncio.sleep(2)
def __create_queue_items(self, tracks) -> None:
"""Create list of CC queue items from tracks."""
async def launch_app(self):
"""Launch the default media receiver app and wait until its launched."""
media_controller = self._chromecast.media_controller
- if (
- media_controller.is_active
- and self.cast_status.app_id == pychromecast.APP_MEDIA_RECEIVER
- and media_controller.status.media_session_id is not None
- ):
- # already active
- return
-
event = asyncio.Event()
- def launched():
+ def launched_callback():
self.mass.loop.call_soon_threadsafe(event.set)
# pylint: disable=protected-access
receiver_ctrl = media_controller._socket_client.receiver_controller
- receiver_ctrl.launch_app(
+ await self.mass.loop.run_in_executor(
+ None,
+ receiver_ctrl.launch_app,
media_controller.app_id,
- callback_function=launched,
+ False,
+ launched_callback,
)
await event.wait()
- async def chromecast_command(self, func, *args, **kwargs):
+ async def chromecast_command(self, func, *args):
"""Execute command on Chromecast."""
if not self.available:
LOGGER.warning(
"Player %s is not available, command can't be executed", self.name
)
return
- await create_task(func, *args, **kwargs)
+ await self.mass.loop.run_in_executor(None, func, *args)