def _verify_manifest(self, full):
        if not hasattr(self, "_stream") or not hasattr(self, "_manifest"):
            return False

        # clean up cache in the process
        cache_dir = CACHE_DIR / self._stream["StreamName"]
        print("* Verifying contents of cache folder {0}.".format(
            str(cache_dir)))

        if cache_dir.exists():
            bundle_names = [bundle["checksum"]
                            for bundle in self._manifest["bundles"]]

            old_bundles = 0
            for cache_file in cache_dir.iterdir():
                if full or cache_file.name not in bundle_names:
                    cache_file.unlink()
                    old_bundles += 1

            if old_bundles:
                print("* Purged {0} old bundle(s).".format(old_bundles))

        # verify bundles in parallel
        with futures.ThreadPoolExecutor(max_workers=self.threads) as executor:
            # this list will contain the bundles we actually need to download
            self._bundles = list()

            bundle_futures = [executor.submit(self._verify_bundle, bundle)
                              for bundle in self._manifest["bundles"]]

            for completed in futures.as_completed(bundle_futures):
                if not completed.result():
                    # cancel waiting futures
                    for future in bundle_futures:
                        future.cancel()
                    return False

        print("* Need to get {0} bundle(s).".format(len(self._bundles)))

        # if we get here there, all bundles were verified
        # we no longer need the manifest
        del self._manifest
        return True