async def METHOD_NAME(self, action, retry=True, is_login=False, is_daap=True):
    resp, status = await action()
    if is_daap:
        resp = parser.parse(resp, lookup_tag)
    self._log_response(action.log_text, resp, is_daap)
    if 200 <= status < 300:
        return resp
    # Seems to be the case?
    if status == 500:
        raise exceptions.NotSupportedError("command not supported at this stage")
    if not is_login:
        # If a request fails, try to login again before retrying
        _LOGGER.info("implicitly logged out, logging in again")
        await self.login()
    # Retry once if we got a bad response, otherwise bail out
    if retry:
        return await self.METHOD_NAME(action, False, is_login=is_login, is_daap=is_daap)
    raise exceptions.AuthenticationError(f"failed to login: {status}")