code: def list_zoo_plugins(info=False):
      """Returns a list of available plugins registered in the
      `FiftyOne Plugins repository <https://github.com/voxel51/fiftyone-plugins>`_
      README.
  
      Example usage::
  
          import fiftyone.plugins.utils as fopu
  
          plugins = fopu.list_zoo_plugins()
          print(plugins)
  
          plugins = fopu.list_zoo_plugins(info=True)
          print(plugins)
  
      Args:
          info (False): whether to retrieve full plugin info for each plugin
              (True) or just return the available info from the README (False)
  
      Returns:
          a list of dicts describing the plugins
      """
      repo = GitHubRepository(
          "https://github.com/voxel51/fiftyone-plugins"
      )
      content = repo.get_file("README.md").decode()
      soup = BeautifulSoup(content, "html.parser")
  
      plugins = []
      for row in soup.find_all("tr"):
          cols = row.find_all(["td"])
          if len(cols) != 2:
              continue
  
          try:
              name = cols[0].text.strip()
              url = cols[0].find("a")["href"]
              description = cols[1].text.strip()
              plugins.append(
                  dict(name=name, url=url, description=description)
              )
          except Exception as e:
              logger.debug("Failed to parse plugin row: %s", e)
  
      if not info:
          return plugins
  
      tasks = [(p["url"], None) for p in plugins]
      return _get_all_plugin_info(tasks)
  
file_path: fiftyone/fiftyone/plugins/utils.py
imports: import logging
  import multiprocessing.dummy
  import os
  from bs4 import BeautifulSoup
  import yaml
  import fiftyone.core.utils
  from fiftyone.utils.github import GitHubRepository
  from fiftyone.plugins.core import PLUGIN_METADATA_FILENAMES
label_desc: Use image node_id 1 for calling a global function with example usage: list_zoo_plugins(info) and returns: _get_all_plugin_info, plugins