async def METHOD_NAME(self, url: str, position: float = 0) -> None:
    """Play media from an URL on the device."""
    retry = 0
    async with timing_server(self.rtsp) as server:
        while retry < PLAY_RETRIES:
            _LOGGER.debug("Starting to play %s", url)
            resp = await self.stream_protocol.METHOD_NAME(server.port, url, position)
            # Sometimes AirPlay fails with "Internal Server Error", we
            # apply a "lets try again"-approach to that
            if resp.code == 500:
                retry += 1
                _LOGGER.debug(
                    "Failed to stream %s, retry %d of %d", url, retry, PLAY_RETRIES
                )
                await asyncio.sleep(1.0)
                continue
            # TODO: Should be more fine-grained
            if 400 <= resp.code < 600:
                raise exceptions.AuthenticationError(f"status code: {resp.code}")
            await self._wait_for_media_to_end()
            return
    raise exceptions.PlaybackError("Max retries exceeded")