code: def grab_file_url(file_url, appname='utool', download_dir=None, delay=None,
                    spoof=False, fname=None, verbose=True, redownload=False,
                    check_hash=False):
      r
      file_url = clean_dropbox_link(file_url)
      if fname is None:
          fname = basename(file_url)
      if download_dir is None:
          download_dir = util_cplat.get_app_cache_dir(appname)
      fpath = join(download_dir, fname)
      if check_hash:
          if isinstance(check_hash, (list, tuple)):
              hash_list = check_hash
          else:
              hash_list = ['md5']
          hash_remote, hash_tag_remote = grab_file_remote_hash(file_url, hash_list, verbose=verbose)
          hash_list = [hash_tag_remote]
          hash_local, hash_tag_local = get_file_local_hash(fpath, hash_list, verbose=verbose)
          if verbose:
              print('[utool] Pre Local Hash:  %r' % (hash_local, ))
              print('[utool] Pre Remote Hash: %r' % (hash_remote, ))
          if hash_remote is None:
              check_hash = False
          elif hash_local is None:
              if verbose:
                  print('[utool] Remote hash provided but local hash missing, redownloading.')
              redownload = True
          elif hash_local == hash_remote:
              assert hash_tag_local == hash_tag_remote, ('hash tag disagreement')
          else:
              if verbose:
                  print('[utool] Both hashes provided, but they disagree, redownloading.')
              redownload = True
      util_path.ensurepath(download_dir)
      if redownload or not exists(fpath):
          if verbose:
              print('[utool] Downloading file %s' % fpath)
          if delay is not None:
              print('[utool] delay download by %r seconds' % (delay,))
              time.sleep(delay)
          download_url(file_url, fpath, spoof=spoof)
      else:
          if verbose:
              print('[utool] Already have file %s' % fpath)
      util_path.assert_exists(fpath)
      if check_hash:
          hash_fpath = '%s.%s' % (fpath, hash_tag_remote, )
          with open(hash_fpath, 'w') as hash_file:
              hash_file.write(hash_remote)
          hash_local, hash_tag_local = get_file_local_hash(fpath, hash_list, verbose=verbose)
          if verbose:
              print('[utool] Post Local Hash: %r' % (hash_local, ))
          assert hash_local == hash_remote, 'Post-download hash disagreement'
          assert hash_tag_local == hash_tag_remote, 'Post-download hash tag disagreement'
      return fpath