code: def get_from_cache(url: str, cache_dir: str = None) -> str:
      """
      Given a URL, look for the corresponding dataset in the local cache.
      If it's not there, download it. Then return the path to the cached file.
      """
      if cache_dir is None:
          cache_dir = MODEL_CACHE
  
      os.makedirs(cache_dir, exist_ok=True)
  
      response = requests.head(url, allow_redirects=True)
      if response.status_code != 200:
          raise IOError(
              "HEAD request failed for url {} with status code {}".format(
                  url, response.status_code
              )
          )
      etag = response.headers.get("ETag")
  
      filename = url_to_filename(url, etag)
  
      # get cache path to put the file
      cache_path = os.path.join(cache_dir, filename)
  
      need_downloading = True
  
      if os.path.exists(cache_path):
          # check if etag has changed comparing with the metadata
          if url.split("/")[-1].endswith("zip"):
              meta_path = cache_path + ".json"
          else:
              meta_path = cache_path + "_meta_" + ".json"
          meta = load_json_file(meta_path)
          if meta["etag"] == etag:
              print("file already present")
              need_downloading = False
  
      if need_downloading:
          print("File not present or etag changed")
          # Download to temporary file, then copy to cache dir once finished.
          # Otherwise you get corrupt cache entries if the download gets interrupted.
          with tempfile.NamedTemporaryFile() as temp_file:
              logger.info(
                  "%s not found in cache, downloading to %s",
                  url,
                  temp_file.name,
              )
  
              # GET file object
              http_get(url, temp_file)
  
              # we are copying the file before closing it, so flush to avoid truncation
              temp_file.flush()
              # shutil.copyfileobj() starts at the current position, so go to the start
              temp_file.seek(0)
  
              logger.info(
                  "copying %s to cache at %s",
                  temp_file.name,
                  cache_path,
              )
              with open(cache_path, "wb") as cache_file:
                  shutil.copyfileobj(temp_file, cache_file)
  
              logger.info("creating metadata file for %s", cache_path)
              meta = {"url": url, "etag": etag}
              if url.split("/")[-1].endswith("zip"):
                  meta_path = cache_path + ".json"
              else:
                  meta_path = cache_path + "_meta_" + ".json"
              with open(meta_path, "w") as meta_file:
                  json.dump(meta, meta_file)
  
              logger.info("removing temp file %s", temp_file.name)
  
      return cache_path, need_downloading
  
file_path: nlp-architect/nlp_architect/utils/file_cache.py
imports: import os
  import logging
  import shutil
  import tempfile
  import json
  from urllib.parse import urlparse
  from pathlib import Path
  from typing import Tuple, Union, IO
  from hashlib import sha256
  from nlp_architect import LIBRARY_OUT
  from nlp_architect.utils.io import load_json_file
  import requests
label_desc: Use image node_id 5 for calling a global function with example usage: get_from_cache(url, cache_dir) and returns: cache_path,  need_downloading