prov = self.providers[prov_id]
LOGGER.info('received command %s for player %s' %(cmd, player.name))
# handle some common workarounds
- if cmd in ['pause', 'play'] and cmd_args == 'toggle':
+ if (cmd in ['pause', 'play'] and cmd_args == 'toggle') or cmd == 'playpause':
cmd = 'pause' if player.state == PlayerState.Playing else 'play'
if cmd == 'power' and (cmd_args == 'toggle' or not cmd_args):
cmd_args = 'off' if player.powered else 'on'
if cmd == 'volume' and cmd_args == 'up':
- cmd_args = player.volume_level + 2
+ cmd_args = player.volume_level + 1
elif cmd == 'volume' and cmd_args == 'down':
- cmd_args = player.volume_level - 2
+ cmd_args = player.volume_level - 1
elif cmd == 'volume' and '+' in str(cmd_args):
cmd_args = player.volume_level + try_parse_int(cmd_args.replace('+',''))
elif cmd == 'volume' and '-' in str(cmd_args):
async def update_player(self, player_details):
''' update (or add) player '''
player_details = deepcopy(player_details)
- LOGGER.debug('Incoming msg from %s' % player_details.name)
player_id = player_details.player_id
player_changed = False
if not player_id in self._players:
if player.cur_item and player_details.cur_item and player.cur_item.name != player_details.cur_item.name:
# track changed
player_changed = True
- LOGGER.info("%s -- STOP PLAYING %s -- SECONDS PLAYED: %s" %(player.name, player.cur_item.name, player.cur_item_time))
- LOGGER.info("%s -- START PLAYING %s" %(player.name, player_details.cur_item.name))
+ if not player.group_parent:
+ LOGGER.info("%s -- STOP PLAYING %s -- SECONDS PLAYED: %s" %(player.name, player.cur_item.name, player.cur_item_time))
+ LOGGER.info("%s -- START PLAYING %s" %(player.name, player_details.cur_item.name))
player.cur_item = player_details.cur_item
elif not player.cur_item and player_details.cur_item:
# player started playing
player_changed = True
- LOGGER.info("%s -- START PLAYING %s" %(player.name, player_details.cur_item.name))
+ if not player.group_parent:
+ LOGGER.info("%s -- START PLAYING %s" %(player.name, player_details.cur_item.name))
player.cur_item = player_details.cur_item
elif player.cur_item and not player_details.cur_item:
# player queue cleared
player_changed = True
- LOGGER.info("%s -- STOP PLAYING %s -- SECONDS PLAYED: %s" %(player.name, player.cur_item.name, player.cur_item_time))
+ if not player.group_parent:
+ LOGGER.info("%s -- STOP PLAYING %s -- SECONDS PLAYED: %s" %(player.name, player.cur_item.name, player.cur_item_time))
player.cur_item = player_details.cur_item
# compare values to detect changes
for key, cur_value in player.__dict__.items():
async def player_command(self, player_id, cmd:str, cmd_args=None):
''' issue command on player (play, pause, next, previous, stop, power, volume, mute) '''
+ if not player_id in self._players or not player_id in self._chromecasts:
+ return
try:
if cmd == 'play':
self._players[player_id].powered = True
# remove any disconnected players...
removed_players = []
for player_id, cast in self._chromecasts.items():
- if not cast.socket_client.is_connected:
+ if not cast.socket_client or not cast.socket_client.is_connected:
LOGGER.info("%s is disconnected" % cast.name)
removed_players.append(player_id)
for player_id in removed_players:
- self._chromecasts[player_id].socket_client.stop.set()
- await asyncio.sleep(1)
- self._chromecasts.pop(player_id, None)
+ try:
+ self._chromecasts[player_id].disconnect()
+ except Exception:
+ pass
+ del self._chromecasts[player_id]
await self.mass.player.remove_player(player_id)
# search for available chromecasts
from pychromecast.discovery import start_discovery, stop_discovery