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.
code: def _download_common(
      self, product_info: Dict[str, Any], path: Path, stop_event
  ):
      # Use a temporary file for downloading
      temp_path = path.with_name(path.name + ".incomplete")
      skip_download = False
      if temp_path.exists():
          size = temp_path.stat().st_size
          if size > product_info["size"]:
              self.logger.warning(
                  "Existing incomplete file %s is larger than the expected final size"
                  " (%s vs %s bytes). Deleting it.",
                  str(temp_path),
                  size,
                  product_info["size"],
              )
              temp_path.unlink()
          elif size == product_info["size"]:
              if (
                  self.verify_checksum
                  and not self.api._checksum_compare(
                      temp_path, product_info
                  )
              ):
                  # Log a warning since this should never happen
                  self.logger.warning(
                      "Existing incomplete file %s appears to be fully downloaded but "
                      "its checksum is incorrect. Deleting it.",
                      str(temp_path),
                  )
                  temp_path.unlink()
              else:
                  skip_download = True
          else:
              # continue downloading
              self.logger.info(
                  "Download will resume from existing incomplete file %s.",
                  temp_path,
              )
              pass
      if not skip_download:
          # Store the number of downloaded bytes for unit tests
          temp_path.parent.mkdir(parents=True, exist_ok=True)
          product_info["downloaded_bytes"] = self._download(
              product_info["url"],
              temp_path,
              product_info["size"],
              path.name,
              stop_event,
          )
      # Check integrity with MD5 checksum
      if self.verify_checksum is True:
          if not self.api._checksum_compare(temp_path, product_info):
              temp_path.unlink()
              raise InvalidChecksumError(
                  "File corrupt: checksums do not match"
              )
      # Download successful, rename the temporary file to its proper name
      shutil.move(temp_path, path)
      return product_info
  
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 4 for calling the Downloader obj's underlying member method code with example usage: obj._download_common(product_info, path, stop_event) and returns: product_info