def METHOD_NAME(self, key, file):
    urls = []
    error_causes = []
    # TODO: priorities etc depending on previous experience or settings
    for url in self.gen_URLS(key):
        urls.append(url)
        try:
            downloaded_path = self._providers.download(
                url, path=file, overwrite=True
            )
            assert(downloaded_path == file)
            return
        except Exception as exc:
            ce = CapturedException(exc)
            debug_msg = f"Failed to download {url} for key {key}: " \
                        f"{ce.format_with_cause()}"
            self.message(debug_msg)
            error_causes.append(ce.format_with_cause())
    error_msg = f"Failed to download from any of {len(urls)} locations"
    if error_causes:
        error_msg += f' {unique(error_causes)}'
    raise RemoteError(error_msg)