async def scan_for_apple_tvs(loop, timeout=<NUM_LIT:5>, abort_on_found=False,<EOL>device_ip=None, only_usable=True,<EOL>protocol=None):
semaphore = asyncio.Semaphore(value=<NUM_LIT:0>, loop=loop)<EOL>listener = _ServiceListener(<EOL>loop, abort_on_found, device_ip, protocol, semaphore)<EOL>zeroconf = Zeroconf()<EOL>try:<EOL><INDENT>ServiceBrowser(zeroconf, HOMESHARING_SERVICE, listener)<EOL>ServiceBrowser(zeroconf, DEVICE_SERVICE, listener)<EOL>ServiceBrowser(zeroconf, MEDIAREMOTE_SERVICE, listener)<EOL>ServiceBrowser(zeroconf, AIRPLAY_SERVICE, listener)<EOL>_LOGGER.debug('<STR_LIT>', timeout)<EOL>await asyncio.wait_for(semaphore.acquire(), timeout, loop=loop)<EOL><DEDENT>except concurrent.futures.TimeoutError:<EOL><INDENT>pass  <EOL><DEDENT>finally:<EOL><INDENT>zeroconf.close()<EOL><DEDENT>def _should_include(atv):<EOL><INDENT>if not only_usable:<EOL><INDENT>return True<EOL><DEDENT>return atv.is_usable()<EOL><DEDENT>return list(filter(_should_include, listener.found_devices.values()))<EOL>
Scan for Apple TVs using zeroconf (bonjour) and returns them.