docs: async def cli_handler(loop):
      """Application starts here."""
      parser = argparse.ArgumentParser()
  
      parser.add_argument('command', nargs='+',
                          help='commands, help, ...')
      parser.add_argument('--name', help='apple tv name',
                          dest='name', default='Apple TV')
      parser.add_argument('--address', help='device ip address or hostname',
                          dest='address', default=None)
      parser.add_argument('--protocol', action=TransformProtocol,
                          help='protocol to use (values: dmap, mrp)',
                          dest='protocol', default=None)
      parser.add_argument('--port', help='port when connecting',
                          dest='port', type=_in_range(0, 65535),
                          default=0)
      parser.add_argument('-t', '--scan-timeout', help='timeout when scanning',
                          dest='scan_timeout', type=_in_range(1, 100),
                          metavar='TIMEOUT', default=3)
      parser.add_argument('--version', action='version',
                          help='version of atvremote and pyatv',
                          version='%(prog)s {0}'.format(const.__version__))
  
      pairing = parser.add_argument_group('pairing')
      pairing.add_argument('--remote-name', help='remote pairing name',
                           dest='remote_name', default='pyatv')
      pairing.add_argument('-p', '--pin', help='pairing pin code',
                           dest='pin_code', metavar='PIN', default=1234,
                           type=_in_range(0, 9999, allow_none=True))
      pairing.add_argument('--pairing-guid',
                           help='pairing guid (16 chars hex)',
                           dest='pairing_guid', default=None)
  
      parser.add_argument('-a', '--autodiscover', action='store_true',
                          help='automatically find a device',
                          dest='autodiscover', default=False)
      parser.add_argument('--device_credentials', help='credentials to device',
                          dest='device_credentials', default=None)
  
      airplay = parser.add_argument_group('airplay')
      airplay.add_argument('--airplay_credentials',
                           help='credentials for airplay',
                           dest='airplay_credentials', default=None)
  
      debug = parser.add_argument_group('debugging')
      debug.add_argument('-v', '--verbose', help='increase output verbosity',
                         action='store_true', dest='verbose')
      debug.add_argument('--debug', help='print debug information',
                         action='store_true', dest='debug')
  
      args = parser.parse_args()
      loglevel = logging.WARNING
      if args.verbose:
          loglevel = logging.INFO
      if args.debug:
          loglevel = logging.DEBUG
  
      logging.basicConfig(level=loglevel,
                          format='%(levelname)s: %(message)s')
      logging.getLogger('requests').setLevel(logging.WARNING)
  
      cmds = retrieve_commands(GlobalCommands)
  
      if args.command[0] in cmds:
          glob_cmds = GlobalCommands(args, loop)
          return (await _exec_command(
              glob_cmds, args.command[0], print_result=False))
      if args.autodiscover:
          if not await _autodiscover_device(args, loop):
              return 1
  
          return await _handle_commands(args, loop)
      if args.address:
          return await _handle_commands(args, loop)
  
      logging.error('To autodiscover an Apple TV, add -a')
  
      return 1