class_docstr: Manages downloading of products or parts of them.
  
  Intended for internal use, but may also be used directly if more fine-grained
  configuration or custom download logic is needed.
  
  Parameters
  ----------
  api : SentinelAPI
      A SentinelAPI instance.
  node_filter : callable, optional
      The callable is used to select which files of each product will be downloaded.
      If None (the default), the full products will be downloaded.
      See :mod:`sentinelsat.products` for sample node filters.
  verify_checksum : bool, default True
      If True, verify the downloaded files' integrity by checking its checksum.
      Throws InvalidChecksumError if the checksum does not match.
  fail_fast : bool, default False
      if True, all other downloads are cancelled when one of the downloads fails in :meth:`download_all()`.
  n_concurrent_dl : integer, optional
      Number of concurrent downloads.
      Defaults to the maximum allowed by :attr:`SentinelAPI.concurrent_dl_limit`.
  max_attempts : int, default 10
      Number of allowed retries before giving up downloading a product in :meth:`download_all()`.
  dl_retry_delay : float, default 10
      Number of seconds to wait between retrying of failed downloads.
  lta_retry_delay : float, default 60
      Number of seconds to wait between requests to the Long Term Archive.
  lta_timeout : float, optional
      Maximum number of seconds to wait for triggered products to come online.
      Defaults to no timeout.
docstr: Download quicklook for a list of products.
  
  Parameters
  ----------
  products : dict
      Dict of product IDs, product data
  directory : string or Path, optional
      Directory where the downloaded images will be downloaded
  n_concurrent_dl : integer
      Number of concurrent downloads
  
  Returns
  -------
  dict[string, dict]
      A dictionary containing the return value from download_quicklook() for each
      successfully downloaded quicklook
  dict[string, dict]
      A dictionary containing the error of products where either
      quicklook was not available or it had an unexpected content type
docstr_tok: ["Download","quicklook","for","a","list","of","products",".","Parameters","--","--","--","--","--","products",":","dict","Dict","of","product","IDs",",","product","data","directory",":","string","or","Path",",","optional","Directory","where","the","downloaded","images","will","be","downloaded","n_concurrent_dl",":","integer","Number","of","concurrent","downloads","Returns","--","--","--","-","dict","[","string",",","dict","]","A","dictionary","containing","the","return","value","from","download_quicklook","(",")","for","each","successfully","downloaded","quicklook","dict","[","string",",","dict","]","A","dictionary","containing","the","error","of","products","where","either","quicklook","was","not","available","or","it","had","an","unexpected","content","type"]
code: def download_all_quicklooks(self, products, directory="."):
      """Download quicklook for a list of products.
  
      Parameters
      ----------
      products : dict
          Dict of product IDs, product data
      directory : string or Path, optional
          Directory where the downloaded images will be downloaded
      n_concurrent_dl : integer
          Number of concurrent downloads
  
      Returns
      -------
      dict[string, dict]
          A dictionary containing the return value from download_quicklook() for each
          successfully downloaded quicklook
      dict[string, dict]
          A dictionary containing the error of products where either
          quicklook was not available or it had an unexpected content type
      """
  
      self.logger.info("Will download %d quicklooks", len(products))
  
      downloaded_quicklooks = {}
      failed_quicklooks = {}
  
      with ThreadPoolExecutor(
          max_workers=self.n_concurrent_dl
      ) as dl_exec:
          dl_tasks = {}
          for pid in products:
              future = dl_exec.submit(
                  self.download_quicklook, pid, directory
              )
              dl_tasks[future] = pid
  
          completed_tasks = concurrent.futures.as_completed(dl_tasks)
  
          for future in completed_tasks:
              product_info = future.result()
              if product_info["error"] == "":
                  downloaded_quicklooks[dl_tasks[future]] = product_info
              else:
                  failed_quicklooks[dl_tasks[future]] = product_info[
                      "error"
                  ]
  
      ResultTuple = namedtuple("ResultTuple", ["downloaded", "failed"])
      return ResultTuple(downloaded_quicklooks, failed_quicklooks)
  
imports: import concurrent.futures
  import enum
  import itertools
  import shutil
  import threading
  import time
  import traceback
  from collections import namedtuple
  from concurrent.futures import ThreadPoolExecutor
  from contextlib import closing
  from pathlib import Path
  from typing import Any, Dict
  from xml.etree import ElementTree
  from sentinelsat.exceptions import InvalidChecksumError, LTAError, LTATriggered, SentinelAPIError, ServerError, UnauthorizedError
label_desc: Use image node_id 11 for calling the Downloader obj's underlying member method code with example usage: obj.download_all_quicklooks(products, directory) and returns: ResultTuple